其他分享
首页 > 其他分享> > Solon详解(四)- Solon的事务传播机制

Solon详解(四)- Solon的事务传播机制

作者:互联网

Solon详解系列文章:
Solon详解(一)- 快速入门
Solon详解(二)- Solon的核心
Solon详解(三)- Solon的web开发
Solon详解(四)- Solon的事务传播机制

在前面的篇章里我们已经见识了 Solon 对事务的控制,及其优雅曼妙的形态。该篇将对事务的传播机制做讲解。出于对用户的学习成本考虑,Solon 借签了Spring 的事务传播策略;并友好的支持多数据源事务。

一、为什么要有传播机制?

Solon 的事务是基于 aop 实现的,用者不用关心事务的开始、提交、回滚,只需要在方法上加 @XTran 注解。因为看不到内部情况,所以也会有些疑问:

这个时候事务的传播机制和策略就派上用场了。

二、传播机制生效条件与特点!

基于 aop 来代理事务控制的方案 ,大都是针对于接口或类的之间调用才起效的;所以在同一个类中两个方法之间的调用,传播机制是无效的。了解这一点很重要,不然容易出乌龙事件。

三、传播机制的策略

下面的类型都是针对于被调用方法来说的,理解起来要想象成两个 service 方法的调用才可以。

传番策略 说明
@XTran(group=true) 如果当前没有事务组,则新建一个事务组;可用于管理多数据源事务,但不会建立链接
@XTran(policy=TranPolicy.required) 如果当前没有事务,就新建一个事务,如果已经存在一个事务中,加入到这个事务中。这是最常见的选择。也是默认。
@XTran(policy=TranPolicy.requires_new) 新建事务,如果当前存在事务,把当前事务挂起。
@XTran(policy=TranPolicy.nested) 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与required类似的操作。
@XTran(policy=TranPolicy.mandatory) 使用当前的事务,如果当前没有事务,就抛出异常。
@XTran(policy=TranPolicy.supports) 支持当前事务,如果当前没有事务,就以非事务方式执行。
@XTran(policy=TranPolicy.not_supported) 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
@XTran(policy=TranPolicy.never) 以非事务方式执行,如果当前存在事务,则抛出异常。

四、XTran 属性说明

属性 说明
value 数据源标识
policy 事务策略
group 是否为事务组;用于管理下属的子事务

五、示例

@XService
public class UserService{
    @XTran
    public void addUser(UserModel user){
        //....
    }
}

@XController
public class DemoController{
    @XInject
    UserService userService; 
    
    //父回滚,子回滚
    //
    @XTran(group = true) 
    @XMapping("/user/add")
    pubblic void addUser(UserModel user){
        userService.addUser(user); 
        throw new RuntimeException("不让你加");
    }
    
    //父回滚,子回滚
    //
    @XTran
    @XMapping("/user/add2")
    pubblic void addUser2(UserModel user){
        userService.addUser(user); 
        throw new RuntimeException("不让你加");
    }
}
@XService
public class UserService{
    @XTran(policy = TranPolicy.requires_new)
    public void addUser(UserModel user){
        //....
    }
}

@XController
public class DemoController{
    @XInject
    UserService userService; 
    
    //父回滚,子不回滚
    //
    @XTran(group = true) 
    @XMapping("/user/add")
    pubblic void addUser(UserModel user){
        userService.addUser(user); 
        throw new RuntimeException("不让你加;但还是加了:(");
    }
    
    //父回滚,子不回滚
    //
    @XTran
    @XMapping("/user/add2")
    pubblic void addUser2(UserModel user){
        userService.addUser(user); 
        throw new RuntimeException("不让你加;但还是加了:(");
    }
}
@XService
public class UserService{
    @XTran(policy = TranPolicy.nested)
    public void addUser(UserModel user){
        //....
        throw new RuntimeException("不让你加");
    }
}

@XController
public class DemoController{
    @XInject
    UserService userService; 
    
    //子回滚父不回滚
    //
    @XTran(group = true) 
    @XMapping("/user/add")
    pubblic void addUser(UserModel user){
        try{
            userService.addUser(user); 
        }catch(ex){ }
    }
    
    //子回滚父不回滚
    //
    @XTran
    @XMapping("/user/add2")
    pubblic void addUser2(UserModel user){
        try{
            userService.addUser(user); 
        }catch(ex){ }
    }
}
@XService
public class UserService{
    @XTran("db1")
    public void addUser(UserModel user){
        //....
    }
}

@XService
public class AccountService{
    @XTran("db2")
    public void addAccount(UserModel user){
        //....
    }
}

@XController
public class DemoController{
    @XInject
    AccountService accountService; 
    
    @XInject
    UserService userService; 
    
    @XTran(group = true) 
    @XMapping("/user/add")
    pubblic void addUser(UserModel user){
        userService.addUser(user);     //会执行db1事务
        
        accountService.addAccount(user);    //会执行db2事务
    }
}

标签:事务,Solon,addUser,XTran,详解,user,public
来源: https://www.cnblogs.com/noear/p/13545461.html