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. 二: sql模式(sql_mode)

    # sql_mode 1 介绍 sql_mode 会影响 MySQL支持的SQL语法以及它执行的数据验证检查.通过设置sql_mode,可以完成不同严格程度 的数据校验,有效地保障数据准确性. MyS ...

  2. Java 多线程------解决 实现Runnabel接口方式线程的线程安全问题 方式二:同步方法 +总结

    方式二:同步方法* 如果操作共享数据的代码完整的声明在一个方法中,我们不妨将此方法声明同步的 1 package bytezero.threadsynchronization; 2 3 4 5 /** ...

  3. Java //输入两个正整数m和n,求其最大的公约数和最小公倍数//12和20的最大公约数是4,最小公倍数是60

    1 //输入两个正整数m和n,求其最大的公约数和最小公倍数 2 //12和20的最大公约数是4,最小公倍数是60 3 4 Scanner scan = new Scanner(System.in); ...

  4. 协议I2C

    SCL   SDA   同步,半双工 开漏+弱上拉,谁用这跟线,就下拉成低电平 想输出,去拉杆子或放手,操作杆子变化 想输入,直接放手,看电平高低就行 线与,一个低电平,全部低电平,可以利用这个执行多 ...

  5. C++容器博客汇总

    文章的原作者为 https://blog.csdn.net/qq_37529913?type=blog C++ STL 容器.迭代器.适配器(深入了解,一文学会) 1.STL容器 2.序列式容器    ...

  6. 音频wav文件转sbc工具wav2sbc下载

    前记: 书到用时方恨少,工具用时方才发现好不到.为了一个工具,也是折腾了有一阵了. 工具说明: 在耳机中,各大芯片公司为了节省内存,本地播放的一般都是sbc格式文件,这就用到了wav转sbc文件的软件 ...

  7. c语言中的指针,数组和结构体结合的一个经典案例

    一 你真正懂了C语言了吗? 很多人刚把c语言用了两年,就以为很懂,等遇到稍微深层次一点的问题,就卡住了.这里,有一个问题,可以考察你对这三者理解如何. 二 一个例子: #include <std ...

  8. JAVA | Guava EventBus 使用 发布/订阅模式

    系列文章目录 Go | Go 语言打包静态文件以及如何与Gin一起使用Go-bindata Go | Gin 解决跨域问题跨域配置 目录 系列文章目录 前言 一.为什么要用 Observer模式以及 ...

  9. Github账号开启账号双重验证

    原文: Github开启双重验证 - Stars-One的杂货小窝 今天在浏览开源项目的时候,突然Github有个提示我要在9月18日前开启双重验证,说是不完成的话,到时候的Github账号会受到限制 ...

  10. day07-1MySQL约束

    MySQL约束 基本介绍 约束用于确保数据库的数据满足特定的商业规则 在mysql中,约束包括:not null,unique,primary key,foreign key 和check 5种 1. ...