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);
}
});
}
}
}
Solon 的事务管理工具类(TranUtils)的更多相关文章
- 阶段3 2.Spring_07.银行转账案例_4 编写事务管理工具类并分析连接和线程解绑
事务管理工具类 首先需要有connection.并且是当前线程上的connection.声明connectionUtils.提供set方法等着spring来注入 有异常需要放在事务里面 close关闭 ...
- android的Log日志打印管理工具类(一)
android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...
- Android 软件管理工具类Utils
Android 软件管理工具类Utils /** * Created by uilubo on 2015/9/30. * 工具类 */ public class Utils { public stat ...
- Fragment管理工具类
Fragment相关→FragmentUtils.java→Demo addFragment : 新增fragment removeFragment : 移除fragment replaceFragm ...
- Dialog对话框管理工具类
import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; i ...
- 可以获取JVM信息的一些管理工具类
一些可以获取JVM信息的java工具类 BufferPoolMXBean.class ClassLoadingMXBean.class CompilationMXBean.class GarbageC ...
- 【Android工具类】Activity管理工具类AppManager
转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 import java.util.Stack; import android.app.Activity; i ...
- 【笔记】cookies管理工具类
package com.ulearning.ulms.util; import java.io.UnsupportedEncodingException; import java.net.URLDec ...
- Logger日志管理工具类
import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...
- Abp公共连接和事务管理方法
Conection 和事务管理在使用数据库的应用中是一个最重要的概念.当你打开一个连接,开始一个事务,如何来处理这些连接等等. 您也许知道,.NET使用了连接池.所以,创建一个连接实际上是从连接池里得 ...
随机推荐
- 连接微信群、Slack 和 GitHub:社区开放沟通的基础设施搭建
NebulaGraph 社区如何构建工具让 Slack.WeChat 中宝贵的群聊讨论同步到公共领域. 要开放,不要封闭 在开源社区中,开放的一个重要意义是社区内的沟通.讨论应该是透明.包容并且方便所 ...
- vscode 文件上传快捷键 shift+alt+s (ftp专用)插件用的 ftp-sync
vscode 文件上传快捷键 shift+alt+s (ftp专用)插件用的 ftp-sync { "key": "shift+alt+s", "co ...
- FreeRTOS教程4 消息队列
1.准备材料 正点原子stm32f407探索者开发板V2.4 STM32CubeMX软件(Version 6.10.0) Keil µVision5 IDE(MDK-Arm) 野火DAP仿真器 XCO ...
- 可穿戴心电ECG监测的技术路径及特点
在传统的医疗设备中,监测心跳速率和心脏活动是经由测量电生理讯号与心电图 (ECG) 来完成的,需要将电极连接到身体来量测心脏组织中所引发电气活动的信号.常见的设备用医院的心电图机,长期监护的动态心电仪 ...
- Spring Boot命令指定环境启动jar包
原文地址:Spring Boot命令指定环境启动jar包 - Stars-One的杂货小窝 记下通过命令行的方式去改变spring boot项目中的环境配置信息 命令 项目中有以下配置 applica ...
- 专访|3DCAT如何赋能Matterverse打造3A游戏画面的Sandbox
元宇宙概念自20世纪90年代创造,在21世纪经历20年快速塑形,终于在2021年进入元年,元宇宙概念爆发,受到政府.机构.企业以及网民的高度关注,资本市场一度高涨,相关投资赛道大热. 元宇宙第一股Ro ...
- C++ Qt开发:QTcpSocket网络通信组件
Qt 是一个跨平台C++图形界面开发库,利用Qt可以快速开发跨平台窗体应用程序,在Qt中我们可以通过拖拽的方式将不同组件放到指定的位置,实现图形化开发极大的方便了开发效率,本章将重点介绍如何运用QTc ...
- 记一次 .NET某施工建模软件 卡死分析
一:背景 1. 讲故事 前几天有位朋友在微信上找到我,说他的软件卡死了,分析了下也不知道是咋回事,让我帮忙看一下,很多朋友都知道,我分析dump是免费的,当然也不是所有的dump我都能搞定,也只能尽自 ...
- 记录--为什么 export 导出一个字面量会报错,而使用 export default 就不会报错?
这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 核心 其实总的来说就是 export 导出的是变量的句柄(或者说符号绑定.近似于 C 语言里面的指针,C++里面的变量别名),而 expo ...
- 一款超酷、功能强大的一体化网站测试工具:Web-Check
今天给大家一款网站一体化测试工具:Web-Check! Web-Check 是一款功能强大的一体化工具,用于发现网站/主机的相关信息.用于检查网页的工具,用于确保网页的正确性和可访问性.它可以帮助开发 ...