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


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

1、看看它的接口:

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、那怎么用它呢?

  • 用它判断当前是否在事务中?
if(TranUtils.inTrans()){
//正在事务中喽...
}
  • 做一个手动的事务控制(与 @Tran 注解等同效果)
@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 (或者别的第三方框架)做事务托管对接
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 是个麻雀工具

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

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

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

@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);
}
});
}
}
}

 


相關推薦

2024-04-18

渲染器的容器注册(提供容器扩展方式) 添加 solon.data TranUtils:getConnectionProxy 接口,方便不同的事务对接 添加 solon.scheduling 对多个 JobInterceptor 及排序支持 添加 solon.cloud 对多个 CloudJobInterceptor 及排序支持 添加 solon.validation&nbs

2023-10-17

https://gitee.com/noear/solon/blob/master/CONTRIBUTING.md 新增 事务管理的 TranListener 机制支持!!! https://gitee.com/noear/solon/issues/I88B7W 新增 Mapping 函数对 TypeVariable 参数类型的识别支持!!! 新增 Mapping 函数父类继承的支持(仅限 publ

2023-09-01

代旧的 Utils IO功能(旧的标为弃用) 增加 @Tran 事务监视事件支持,并增加 message 属性(只在最外层触发事件) 调整 kafka-solon-cloud-plugin 如果没有订阅,则不启用消费端 调整 PathLimiter 的弃用提示方式 调整 solon.cloud

2023-11-03

eable 接口的 bean 也关掉(感谢用户建议) 优化 solon.data 事务监听 afterCommit 事件之前移除事务状态(感谢用户建议) 优化 属性引用表达式,当环境变量无时马上使用默认值(环境变量是启动时即决定有无)(感谢用户建议)

2023-11-18

的支持(之前,只能在启动时决定) 添加 @Tran 事务注解处理对动态开关的支持(之前,只能在启动时决定) 添加 solon.boot.smarthttp 外部优先级处理(成为默认后,要方便外部替换它) 调整 smart-http,jetty,undertow 统一使

2023-12-13

@Body 后 path 参数不能显示的问题 调整 solon.data nested 事务微略处理 socket.d 升为 2.1.7 folkmq 升为 1.0.18 nacos2 升为 2.3.0 sqltoy 升为 5.2.85 项目仓库地址? gitee:https://gitee.com/noear/solon github:https://github.com/noear/solon

2023-11-15

:存放空间只有 100M,内存只有 100M,在硬件里运行一个管理界面系统。他研究了 spring native,因为它的基础就太大没过;研究了 go,做复杂的界面系统不好预期没过。所以选择尝试 solon。 于是他种下了一颗 solon native 的种子。

2022-12-25

调整 EventBus:push 非异常事件,允许透传异常(从而支持事务回滚传导) 升级 sqltoy 为 5.2.28 进一步了解 Solon: 《想法与架构笔记》 《生态预览》 《与 Spring Boot 的区别?》 《与 Spring Cloud 的区别?》 项目仓库:

2023-01-25

_JSON_VALUE 值(比 APPLICATION_JSON_VALUE 简短些) 增加 RunUtil 工具类,由 Util 部分接口分离 调整 solon.scheduling.simple 对固定频率与固定延时的处理 调整 solon.scheduling.quartz 对 name 的配置支持,及更多异常提醒 调整 quatz-solon-plugin

2023-09-22

中,效果很猛!有一种:天哪天哪天哪。。。的感觉 @SolonMain public class App { public static void main(String[] args) { Solon.start(App.class, args, app->{ app.onEvent(HttpServerConfigure.class, e->{ e.setExecutor(Executors.newVirtualThreadPerTaskExecutor()); }); }); } }

2022-10-07

案 同时支持 jdk8, jdk11, jdk17, jdk19 本次更新: 新增 solon.cloud.eventplus 插件,替代 cloudevent-plus-solon-plugin 插件 调整 solon cloud 插件重新命名为:???-solon-cloud-plugin(旧插件仍可使用) 调整 AopContext 内部对象的订阅,从 EventBus

2023-03-22

Solon 是一个高效的 Java 应用开发框架:更快、更小、更简单。它是一个有自己接口标准规范的开放生态,可为应用软件国产化提供支持,助力信创建设。 150来个生态插件,覆盖各种不同的应用开发场景: 相对于 Spring Boot 和 S

2024-02-19

Java Solon 是什么框架? Java "生态级"应用开发框架。从零开始构建,有自己的标准规范与开放生态。(历时七年,具备全球第二级别的生态规模) 相对于 Spring,有什么特点? 启动快 5 ~ 10 倍。 (更快) 每秒并发数高

2023-05-04

Java 新的生态型应用开发框架,Solon :更快、更小、更简单。从零开始构建,有自己的标准规范与开放生态: 150多个生态插件,可以满足各种场景开发 大量的国产框架适配,可以为应用软件国产化提供更好支持 相对于 Spr