【问题标题】:if all these transactions pass then only it will commit.. If any one of the transactions fail it will rollback all the transctons如果所有这些事务都通过,那么只有它会提交。如果任何一个事务失败,它将回滚所有事务
【发布时间】:2019-03-10 15:59:30
【问题描述】:

我在面试中被问到这个问题..你能告诉我答案吗 有一个表员工.. 有身份证姓名地址和薪水.. 他有资格获得一张 200 卢比的礼品卡和另一张 100 卢比的礼品卡.. 他将被收取 50 卢比的税额..

如果所有这些事务都通过,那么只有它会提交。如果任何一个事务失败,它将回滚所有上述事务。 IE。有三个或更多事务..如果即使 1 个失败,所有执行的事务都会回滚并且对数据库没有影响。如果全部通过,则只有数据库注册更改

【问题讨论】:

  • 你的问题到底是什么?
  • 是的,这就是提交和回滚的概念。请您澄清一下,您需要了解什么?
  • 嗨,问题是如何确保所有 3 个事务都工作,然后只有事务被提交,否则即使一个事务失败,也可以回滚对任何事务的所有更改。如何进行这样的安排。例如。 200rs 作为礼品卡添加到工资中。如果加了 200 卢比,则在工资中增加 100 卢比作为礼品卡,如果上述两项工作,则从工资中减去 50 卢比作为税金。如果所有事务都工作,那么只有它被提交。如果即使有一个失败,那么所有事务都会回滚,并且对数据库没有影响。这是如何运作的?那是我的问题

标签: spring oracle hibernate transactions


【解决方案1】:

在 Hibernate 或 Spring 中实现事务可以通过多种方式完成。一种也是最容易实现的方法是自己创建和关闭事务。就像下面的例子。

public void modifyEmployee(String employeeID) {
    Session session = factorySession.openSession();
    Transaction transaction = session.beginTransaction();
    try {
        Employee employee = session.get(Employee.class, employeeID);
        employee.setSalary(employee.getSalary()+200);
        session.update(employee);
        employee.setSalary(employee.getSalary()+100);
        session.update(employee);
        employee.setSalary(employee.getSalary()-50);
        session.update(employee);
    } catch(Exception e) {
        transaction.rollback();
    } finally {
        transaction.commit();
        session.close();
    }       
}

如您所见,如果任何事务失败,那么我们将捕获该错误并回滚事务。只有当我们能够完成所有更新而没有失败时,我们才能提交事务。

有一个更好的方法可以做到这一点,但需要更多的配置。我仍然会推荐它,因为它使事务管理更容易,代码更简洁,那就是使用 Spring Transactional Manager。这将允许 Spring 管理您的事务,因此您不必担心提交或打开,甚至关闭您的会话。另外,使用注释:

@Transactional(rollbackFor = Exception.class) 

在任何服务的方法之上,如果任何操作失败,即使是那些与数据库无关的操作,也应始终回滚方法内所做的任何更改。

我希望这会有所帮助。

【讨论】:

    【解决方案2】:

    在 BEGIN - EXCEPTION - END 块中执行。您必须添加代码来更新薪水。如果将其封装在过程中,请确保内部没有提交。

    BEGIN
      --add 200rs
    
      --add 100rs
    
      --substract 50rs
    
      COMMIT;
    
    EXCEPTION
      WHEN OTHERS THEN
        ROLLBACK;
    
    END;
    

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2019-02-09
      • 1970-01-01
      • 2019-05-29
      • 1970-01-01
      • 2015-10-25
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多