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)的更多相关文章

  1. 阶段3 2.Spring_07.银行转账案例_4 编写事务管理工具类并分析连接和线程解绑

    事务管理工具类 首先需要有connection.并且是当前线程上的connection.声明connectionUtils.提供set方法等着spring来注入 有异常需要放在事务里面 close关闭 ...

  2. android的Log日志打印管理工具类(一)

    android的Log日志的打印管理工具类: package com.gzcivil.utils; import android.util.Log; /** * 日志打印管理 * * @author ...

  3. Android 软件管理工具类Utils

    Android 软件管理工具类Utils /** * Created by uilubo on 2015/9/30. * 工具类 */ public class Utils { public stat ...

  4. Fragment管理工具类

    Fragment相关→FragmentUtils.java→Demo addFragment : 新增fragment removeFragment : 移除fragment replaceFragm ...

  5. Dialog对话框管理工具类

    import android.app.Dialog; import android.content.Context; import android.content.DialogInterface; i ...

  6. 可以获取JVM信息的一些管理工具类

    一些可以获取JVM信息的java工具类 BufferPoolMXBean.class ClassLoadingMXBean.class CompilationMXBean.class GarbageC ...

  7. 【Android工具类】Activity管理工具类AppManager

    转载请注明出处:http://blog.csdn.net/zhaokaiqiang1992 import java.util.Stack; import android.app.Activity; i ...

  8. 【笔记】cookies管理工具类

    package com.ulearning.ulms.util; import java.io.UnsupportedEncodingException; import java.net.URLDec ...

  9. Logger日志管理工具类

    import java.io.File; import java.io.FileNotFoundException; import java.io.FileOutputStream; import j ...

  10. Abp公共连接和事务管理方法

    Conection 和事务管理在使用数据库的应用中是一个最重要的概念.当你打开一个连接,开始一个事务,如何来处理这些连接等等. 您也许知道,.NET使用了连接池.所以,创建一个连接实际上是从连接池里得 ...

随机推荐

  1. flutter3-winchat桌面端聊天实例|Flutter3+Dart3+Getx仿微信Exe程序

    首发原创flutter3+bitsdojo_window+getx客户端仿微信exe聊天Flutter-WinChat. flutter3-dart3-winchat 基于flutter3+dart3 ...

  2. Java 类中属性的使用

    1 类中属性的使用: 2 * 属性(成员变量) 局部变量 3 * 1.相同点: 4 * 定义变量的个格式: 数据类型 变量名 = 变量值 5 * 先声明 后使用 6 * 变量都有其对应的作用域 7 * ...

  3. 用几张图实战讲解MySQL主从复制

    本文分享自华为云社区<结合实战,我为MySQL主从复制总结了几张图!>,作者: 冰 河. MySQL官方文档 MySQL 主从复制官方文档链接地址如下所示: http://dev.mysq ...

  4. JS4-BOM浏览器对象类型

    什么是BOM 浏览器的顶级对象 页面加载事件以及注意事项 定时器函数 JS执行机制 页面跳转.刷新 history.navigator对象 什么是BOM 浏览器对象模型(Browser Object ...

  5. springboot使用pagehelper

    自己写的用户系统项目需要加个分页,之前都是用现成的,或者使用在sql里面拼接分页查询,这次任务紧急想直接找个包实现吧,找了很多博客看了都不行啊,不知道为啥,最后还是找了之前maven使用的包才行,简单 ...

  6. chm之已取消到该网页的导航解决办法

    1. 右键单击该 CHM 文件,然后单击"属性". 2. 单击"取消阻止"或者"解除锁定". 3. 双击此 .chm 文件以打开此文件.

  7. 菜鸟角度简单分析BP算法(Error Back Propagation)

    PS:要转载请注明出处,本人版权所有. PS: 这个只是基于<我自己>的理解, 如果和你的原则及想法相冲突,请谅解,勿喷. 前置说明   本文作为本人csdn blog的主站的备份.(Bl ...

  8. eviacam在Arch/Manjaro Linux下的安装

    安装base-devel 安装编译工具,默认的依赖里没有编译工具 sudo yay -S base-devel 如果安装编译工具,会报类似下面的错误: 安装eviacam yay -S eviacam ...

  9. 记录--uni-app adb安卓wifi无线调试

    这里给大家分享我在网上总结出来的一些知识,希望对大家有所帮助 方法一 adb connect连接调试 前提条件: 电脑已安装adb工具 手机和电脑连接的同一个WIFI CMD进入到adb工具所在目录, ...

  10. C++ Concurrency in Action 读书笔记三:并发操作的同步

    Chapter 4 并发操作的同步·Synchronizing concurrent operations