春季交易流程

问题描述

需要了解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;
    }
}

解决方法

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

出于完整性考虑,我建议用C1:lockData注释@Transactional(propagation = Propagation.REQUIRED)