【问题标题】:Spring Transactions Flow春季交易流程
【发布时间】:2020-12-18 18:25:39
【问题描述】:

需要了解lockData的三个流是否都在一个事务中。当流回到类 A1 时,我可以看到类 C1 对表员工添加的行锁吗?

当前流程是:A1 的实例调用B1 的实例,而后者又调用C1 的实例

class A1 {
    @Transactional(propagation = Propagation.REQUIRES_NEW)
    public void lockData(){ 
        B1 classBObj = ctx.getBean("B1");
        boolean locked = classBObj.lockData();      
        //Check if lock on employee table is still there.
    }   
}

class B1 {
    @Transactional(propagation = Propagation.REQUIRED)
    public void lockData(){ 
        C1 classCObj = ctx.getBean("C1");
        classCObj.lockData();   
        return true;
    }
}

class C1 {  
    public void lockData(){ 
        executeQuery("select * from employee where emp_id=1 for update");
        return true;
    }
}

【问题讨论】:

    标签: java spring jdbc spring-transactions


    【解决方案1】:

    如果使用的A1 的实例是一个spring-bean 并通过spring bean 上下文注入,那么是的,对a1.lockData() 的调用(及其所有嵌套调用)将在一个事务中执行。

    为了完整起见,我建议用 @Transactional(propagation = Propagation.REQUIRED) 注释 C1:lockData

    【讨论】:

    • A1 是一个 JSF managed-bean 。 B1和C1是春豆。当流从 C1 返回到 B1 时,我能够看到 db 级别的行锁。问题是当流程回到 A1 时,我无法在 db 级别看到行锁。
    • A1 bean 必须通过 Spring-bean 上下文创建。否则,它不会被包装在适当的代理中来创建事务。我更新了答案以包含此信息。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-14
    • 2014-05-28
    • 2012-08-10
    • 1970-01-01
    • 2011-08-27
    相关资源
    最近更新 更多