Solon 的事务管理工具类(TranUtils)

Solon 在编码上,是强调注解与手写并重的一个风格。它有个 @Tran 注解,用于事务管理(可以参考:《事务的全局控制及应用》)。这里,主要是讲讲它的手动处理工具类 TranUtils

1、看看它的接口:

java 复制代码
public final class TranUtils {
    //执行事务
    public static void execute(Tran tran, RunnableEx runnable) throws Throwable;
    //是否在事务中
    public static boolean inTrans();
    //是否在事务中且只读
    public static boolean inTransAndReadOnly();
    //监听事务
    public static void listen(TranListener listener) throws IllegalStateException;
    //获取链接
    public static Connection getConnection(DataSource ds) throws SQLException;
    //获取链接代理(方便,用于第三方框架事务对接)
    public static Connection getConnectionProxy(DataSource ds) throws SQLException;
}

2、那怎么用它呢?

  • 用它判断当前是否在事务中?
java 复制代码
if(TranUtils.inTrans()){
    //正在事务中喽...
}
  • 做一个手动的事务控制(与 @Tran 注解等同效果)
java 复制代码
@Component
public class UserService{
    
    //@Tran(policy=TranPolicy.requires_new) 
    public void addUser(UserModel user)  throws Throwable{
        TranUtils.execute(new TranAnno().policy(TranPolicy.requires_new), ()->{
            //...
        });
    }
}

@Controller
public class DemoController{
    @Inject
    UserService userService; 
    
    //父回滚,子不回滚
    //
    //@Tran
    @Mapping("/user/add2")
    pubblic void addUser2(UserModel user){
        TranUtils.execute(new TranAnno(), ()->{
            userService.addUser(user); 
            throw new RuntimeException("不让你加;但还是加了:(");
        });
    }
}
  • 用它与 dbvisitor (或者别的第三方框架)做事务托管对接
java 复制代码
public class SolonManagedDynamicConnection implements DynamicConnection {
    private DataSource ds;

    public SolonManagedDynamicConnection(DataSource ds) {
        this.ds = ds;
    }

    @Override
    public Connection getConnection() throws SQLException {
        return TranUtils.getConnectionProxy(ds);
    }

    @Override
    public void releaseConnection(Connection conn) throws SQLException {
        conn.close();
    }
}

3、TranUtils 是个麻雀工具

麻雀虽然,五脏具全。还可以在运行时,动态添加事务监听哦。先看看事务监听器接口:

java 复制代码
public interface TranListener {
    //顺序位
    default int getIndex();
    //提交之前(可以出异常触发回滚)
    default void beforeCommit(boolean readOnly) throws Throwable;
    //完成之前
    default void beforeCompletion();
    //提交之后
    default void afterCommit();
    //完成之后
    default void afterCompletion(int status);
}

然后,我们试着做一个事务监听:

java 复制代码
@Component
public class UserService {
    @Inject
    UserDao userDao;
    
    //添加并使用事务
    @Tran
    public void addUserAndTran(User user){
        userDao.add(user);
        onUserAdd();
        
        //这里明确知道有事务
        TranUtils.listen(new TranListener() {
            @Override
            public void afterCompletion(int status) {
                System.err.println("---afterCompletion: " + status);
            }
        });
    }
    
    //添加(不使用事务)
    public vod addUser(User user){
        userDao.add(user);
        onUserAdd();
    }
    
    private void onUserAdd(){
        //这里不确定是否有事务,先判断下
        if(TranUtils.inTrans()){
            TranUtils.listen(new TranListener() {
                @Override
                public void afterCompletion(int status) {
                    System.err.println("---afterCompletion: " + status);
                }
            });
        }
    }
}
相关推荐
组合缺一3 天前
灵动如画 —— 初识 Solon Graph Fluent API 编排
java·solon·graph·flow·langgraph·liquor
Chloeis Syntax3 天前
MySQL初阶学习日记(8)--- JDBC
java·数据库·笔记·学习·mysql·jdbc
带刺的坐椅4 天前
灵动如画 —— 初识 Solon Graph Fluent API 编排
java·ai·agent·solon·flow·langgraph
带刺的坐椅11 天前
通用流程编排框架,Solon Flow v3.8.0 隆重发布
java·solon·flowable·flow·drools
带刺的坐椅14 天前
迈向 MCP 集群化:Solon AI (支持 Java8+)在解决 MCP 服务可扩展性上的探索与实践
java·ai·llm·solon·mcp
带刺的坐椅15 天前
超越 SpringBoot 4.0了吗?OpenSolon v3.8, v3.7.4, v3.6.7 发布
java·ai·springboot·web·solon·flow·mcp
蟹至之19 天前
【MySQL】JDBC的使用(万字解析)
java·数据库·mysql·jdbc
自在极意功。25 天前
深入解析JDBC:Java数据库操作的基础
java·开发语言·数据库·jdbc
组合缺一1 个月前
Solon AI 开发学习17 - generate - 使用复杂提示语
java·学习·ai·llm·solon·mcp
组合缺一1 个月前
Solon AI 开发学习19 - 结合 Solon Flow 定制 ReAct 效果
java·人工智能·学习·ai·llm·openai·solon