春天的物理和逻辑交易的区别

时间:2013-05-24 09:19:39

标签: java spring transactions spring-transactions

在这个春季文件中 http://static.springsource.org/spring/docs/3.2.x/spring-framework-reference/html/transaction.html 。它讲的是物理和逻辑交易。我写了一个非常简单的程序来理解它

TransactionObject.java

class TransactionObject {

    private static Connection conn;

    TransactionObject() {
        try {
            conn = DriverManager.getConnection("DB_URL", "USER", "PASS");
        } catch (SQLException e) {}
    }

    void rollBack() {
        try {
            conn.rollback();
        } catch (SQLException e) { }
    }

    void Commit() {
        try {
            conn.commit();
        } catch (SQLException e) { }
    }
}

ClassMethodUnderTransactionObject.java

public class ClassMethodUnderTransactionObject {
    // start fresh TransactionObject
    TransactionObject  logical= new TransactionObject();

    M2(); // call M2 use same logical object
    M3(); // call M3 use same logical object
    // For M2 and M3 it is logical transaction because both using same transaction object

    if(error){
        logical.rollBack();  
    } else {
        logical.Commit(); 
    }

    // create another instance of TransactionObject
    TransactionObject  physical=new TransactionObject();

    M4(); // call M4 use different TransactionObject object
    if(error){
        physical.rollBack();  
    } else {
        physical.Commit(); 
    }

因此M4对M2和M3使用物理事务,因为M4使用不同的trasnactionObject

这是我们应该理解的方式吗?还有更多要理解。请帮助我理解它。

2 个答案:

答案 0 :(得分:0)

我理解这个

  • physical transaction来自外部世界
  • logical transaction是你的内心。

这有许多后果在文档中描述。

我不明白你的榜样。

答案 1 :(得分:0)

根据Spring文档,当 PROPAGATION.PROPAGATION_REQUIRED 时:如果tx不存在,则创建一个新的事务;如果已经存在,则使用现有的事务。

假设我们已经在运行事务,现在必须将事务应用于服务层的methodA,MethodB,MethodC。

现在在这种情况下,methodA,MethodB,MethodC将在逻辑事务中运行,并且它们将是封装所有其他逻辑事务的一个物理事务,所有这些逻辑txn范围在逻辑上均与物理txn范围无关。但它们映射到相同的实物交易。

  • 方法A的逻辑txn +方法B的逻辑txn +方法B的逻辑txn->物理Txn范围

所有逻辑txn只能定义其单独的回滚规则,并且一旦从逻辑txn触发的回滚规则被抛出, UnexpectedRollbackException ,并且物理txn仍可以调用commit,因为物理txn不受其范围限制逻辑Txn。但是当物理遇到 UnexpectedRollbackException (即RunTimeException(未经检查的异常))时,它将触发整个物理txn的回滚,并且客户端会看到发生了回滚。