【问题标题】:Difference between physical and logical transactions in springspring中物理事务和逻辑事务的区别
【发布时间】:2013-05-19 20:26:20
【问题描述】:

在这个春季文档中 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

我们应该这样理解吗

【问题讨论】:

    标签: java spring transactions spring-transactions


    【解决方案1】:

    我是这样理解的

    • physical transaction 来自外部世界
    • logical transaction 是您的内部人员。

    这会导致文档中描述的许多后果。

    我不明白你的例子。

    【讨论】:

      【解决方案2】:

      根据Spring documentation,PROPAGATION.PROPAGATION_REQUIRED 如果交易尚不存在则创建新交易,如果交易已存在则使用现​​有交易。

      假设我们已经有一个事务正在运行,并将在我们的一项服务中将事务应用于methodA、methodB 和methodC。

      在这种情况下,methodA、methodB、methodC 将在逻辑事务中运行,而只有一个物理事务封装了所有其他逻辑事务。所有这些逻辑事务范围在逻辑上独立于物理事务范围。但它们映射到同一个物理事务。

      所以:methodA 的逻辑事务 + methodB 的逻辑事务 + methodB 的逻辑事务 -> physical transaction

      每个逻辑事务都可以定义其单独的回滚规则。一旦从逻辑事务触发回滚规则,就会抛出UnexpectedRollbackException,但物理事务仍然可以调用提交,因为物理事务独立于逻辑事务的范围。但是当物理事务遇到UnexpectedRollbackException(这是一个未选中的RuntimeException)时,它会触发整个物理事务的回滚,客户端会看到发生了回滚。

      【讨论】:

        猜你喜欢
        • 2016-12-02
        • 2015-05-10
        • 2020-09-06
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2011-09-23
        • 1970-01-01
        相关资源
        最近更新 更多