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

2024-05-08

加 solon Utils:pid 方法(方便获取进程号) 添加 solon.data TranUtils:getDataSourceProxy 方法 添加 solon.cloud CloudProps:getNamespace 方法,允许每个中间件有自己 namespace 配置 添加 solon.net WebSocketListener::onPing,onPong 方法,允许获得 ping/pong 的

2023-10-17

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

2024-05-21

类(提供简单模板支持) 添加 RoutingDataSource 对事务管理的支持(即动态数据源支持事务管理) 添加 Solon Cloud Event 消息事务支持! 优化 Bean 集合注入时,乎略泛型 优化 smarthttp 和 jetty 适配,queryString 和 from-data 同

2023-09-01

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

2023-11-03

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

2024-10-31

CacheLib.cacheFactoryAdd("local", new LocalCacheFactoryImpl()); //添加事务控制支持 if (context.app().enableTransaction()) { context.beanInterceptorAdd(Tran.class, TranInterceptor.instance, 120); } //添加缓存控制支持 if (context.app().enableCaching()) { CacheLib.cacheServiceAddIfAb

2024-05-17

事件总线的解决方案。也是 Solon “最终一致性”分布式事务的解决方案之一 2、事务特性 事务?就是要求 Event 有原子性,当多个 Event 发布时,要么全成功,要么全失败。 public class EventDemo { public void event_tran() { //新建一个 Ev

2024-07-13

ssLoader 方法 添加 solon Router::getBy(controllerClz) 方法,用于管理需求 添加 solon ChainManager::addExecuteHandler(e,index) 方法,支持执行器排序 添加 solon RouterInterceptor::postArguments 提交参数确认(更方便 mvc 参数定制) 添加 solon UploadedFil

2023-11-18

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

2024-08-27

onBean, onBeanName) 条件属性 添加 solon.validation ValidUtils 工具类 添加 solon LifecycleBean:postStart 方法 添加 solon MethodInterceptor 接口,替代 Interceptor(旧接口保留) 添加 solon.net.httputils 扩展机制,并与 solon.cloud 自动整合 添加 so

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 的区别?》 项目仓库: