首页 > 其他分享 >Solon 的事务管理工具类(TranUtils)

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

时间:2024-04-14 12:22:38浏览次数:19  
标签:事务 Solon void TranUtils 管理工具 throws user public

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,void,TranUtils,管理工具,throws,user,public
From: https://www.cnblogs.com/noear/p/18133982

相关文章

  • Windows 软件管理工具 Scoop 的使用
    Windows软件管理工具Scoop的使用卸载Scoop打开PowerShell输入scoopuninstallscoop输入scooplist查看是否卸载成功安装Scoop打开PowerShell查看PowerShell版本Get-Host|Select-ObjectVersion确保安装PowerShell5(或更高版本,包括PowerShell核......
  • Centos7-kvm-WEB管理工具kimchi使用篇
    镜像上传接上篇安装完wok和kimchi这两个服务后,能正常访问https://localhost:8001 (输入地址一定是Https!!!)   功能介绍导航栏wok是查看报错日志和操作记录的,同时设置项可以开关kimchi状态     导航栏的Virtualization分为访客模板存储器网络(这......
  • hideNsneak:一款功能强大的渗透测试基础设施管理工具
    关于hideNsneakhideNsneak是一款功能强大的渗透测试基础设施管理工具,该工具可以帮助广大研究人员可以轻松部署和管理各种云服务接口,并辅助渗透测试人员管理渗透测试基础设施,其中包括虚拟机、域前置、CobaltStrike服务器、API网关和防火墙等。功能介绍hideNsneak提供了一个......
  • 密码管理工具KeeWeb使用
    好处统一管理密码自动填充 浏览器google或opera,我使用的opera客户端分为桌面端和web,推荐使用webhttps://app.keeweb.info安装设置汉化选择最后一个使用插件安装,安装中文语言包插件浏览器集成   建立链接后续则可以自动填入密码 ......
  • 【Docker】搭建便捷的Docker容器管理工具 - dockerCopilot
    【Docker】搭建便捷的Docker容器管理工具-dockerCopilot前言本教程基于绿联的NAS设备DX4600Pro的docker功能进行搭建。前面有介绍过OneKey,而dockerCopilot便是OneKey的升级版,作者对其进行了重新命名,并且对界和功能都进行了全面的优化。目前通过绿联自带的Docker管理器......
  • Vue — Vue3.0状态管理工具Pinia
    一、什么是Pinia?Pinia是一个专门为Vue3设计的状态管理库。它的目标是提供一种简单、直观的方法来管理Vue应用的状态,同时充分利用Vue3的响应式系统和组合式API。Pinia主要特点包括:基于Vue3:Pinia是专门为Vue3设计的状态管理库,充分利用了Vue3的响应式系统......
  • .NET开源、免费、跨平台的Git可视化管理工具
    前言俗话说得好“工欲善其事,必先利其器”,合理的选择和使用可视化的管理工具可以降低技术入门和使用的门槛。今天大姚给大家分享一款.NETAvalonia开源、免费、跨平台、快速的Git可视化管理工具:SourceGit。Avalonia介绍Avalonia是一个强大的框架,使开发人员能够使用.NET创建跨平......
  • hatch python 现代项目管理工具
    hatchpython现代项目管理工具,以下是一些简单试用安装clibrewinstallhatch一些推荐配置这样我们的venv直接在执行目录中,比较方便使用hatchconfigsetdirs.env.virtual.hatch简单项目clihatchnewdalongdemo......
  • 第16期 Double Commander 开源免费的Total Commander替代型【体验100款文件管理工具】
     体验背景:我们正在做一款文件版本管理软件,追光几何(追光几何),期待以最无感的方式,解决新一代工程师文件管理的问题,让大家有更多时间去做快乐和有成就感的事情。所以打算体验100款文件管理软件,来取长补短。真实1h体验DoubleCommander是一款开源的跨平台文件管理软件,灵感来源......
  • Hexo发布管理工具
    hexo-commander在本地使用hexo,往往需要多次打开使用命令行工具重复输入命令。虽然有个hexo-admin项目可以方便使用,然而该项目已经不再维护,并且为web页面,在本地使用不如桌面软件方便。因此用qt写了这个工具方便编辑发布文章到hexo博客。源码:https://github.com/weloe/hexo-co......