alibaba / COLA

🥤 COLA: Clean Object-oriented & Layered Architecture
GNU Lesser General Public License v2.1
11.97k stars 3.08k forks source link

statemachine事务失效 #528

Closed Dreaming9420 closed 3 months ago

Dreaming9420 commented 3 months ago

5.x-SNAPSHOT版本 给.perform(orderActionTest.doAction())里的doAction方法加@Transactional没用,框架内部产生了自调用问题,导致事务失效 https://juejin.cn/post/7234059110236700730 image image

solano33 commented 3 months ago

今天我也碰到了这个问题,你这里doAction其实是用来注册action的,加上事务其实说不通。本质应该是调用了是action里的execute方法, 因此我的解决方法是将这个内部类注册成bean,同时在重写的execute上声明事务

benym commented 3 months ago

我是这篇文章的作者,这其实并非是框架的问题,而是早期在实践状态机过程中的错误用法,正确用法如上面的回答提及的 你应该直接传递实现了Action的Bean,而不需要再通过Service类+匿名内部类的方式进行状态机定义

@Resource
@Qualifier("actionTest")
private Action<AuditState, AuditEvent, AuditContext> actionTest;

StateMachineBuilder<AuditState, AuditEvent, AuditContext> builder = StateMachineBuilderFactory.create();
builder.externalTransition().from(AuditState.APPLY).to(AuditState.DAD_PASS)
        .on(AuditEvent.PASS)
        .perform(actionTest);

对应的ActionTest为

@Component
public class ActionTest implements Action<AuditState, AuditEvent, AuditContext> {

    @Override
    @Transactional
    public void execute(AuditState from, AuditState to, AuditEvent event, AuditContext context) {

    }
}

这样事务将会起作用,晚些时候我将勘误这篇文章

Dreaming9420 commented 3 months ago

今天我也碰到了这个问题,你这里doAction其实是用来注册action的,加上事务其实说不通。本质应该是调用了是action里的execute方法, 因此我的解决方法是将这个内部类注册成bean,同时在重写的execute上声明事务

明白了,谢谢

Dreaming9420 commented 3 months ago

我是这篇文章的作者,这其实并非是框架的问题,而是早期在实践状态机过程中的错误用法,正确用法如上面的回答提及的 你应该直接传递实现了Action的Bean,而不需要再通过Service类+匿名内部类的方式进行状态机定义

@Resource
@Qualifier("actionTest")
private Action<AuditState, AuditEvent, AuditContext> actionTest;

StateMachineBuilder<AuditState, AuditEvent, AuditContext> builder = StateMachineBuilderFactory.create();
builder.externalTransition().from(AuditState.APPLY).to(AuditState.DAD_PASS)
        .on(AuditEvent.PASS)
        .perform(actionTest);

对应的ActionTest为

@Component
public class ActionTest implements Action<AuditState, AuditEvent, AuditContext> {

    @Override
    @Transactional
    public void execute(AuditState from, AuditState to, AuditEvent event, AuditContext context) {

    }
}

这样事务将会起作用,晚些时候我将勘误这篇文章

好的,谢谢