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); } }); } } }

低调大师中文资讯倾力打造互联网数据资讯、行业资源、电子商务、移动互联网、网络营销平台。
持续更新报道IT业界、互联网、市场资讯、驱动更新,是最及时权威的产业资讯及硬件资讯报道平台。
转载内容版权归作者及来源网站所有,本站原创内容转载请注明来源。
- 上一篇
深数所发布 500 个行业多模态算料集
在日前举办的“数·算·网”融合发展暨粤港澳大湾区算力服务联盟第一期交流研讨会上,深圳数据交易所发布了500个垂直行业多模态算料集,按照大模型应用的不同阶段,有的放矢地提供数据源,让国产大模型厂商“寻数有路”。 此次深数所发布的首批500个人工智能大模型高质量训练数据集,由37家不同的数据商提供,涵盖12个“数据要素×”领域,3家境外数据商,7类数据模态(文本、图像、音频、视频、多模态、3D、GIS等)。 且本批数据集首次汇聚了来自中国气象局、中国知网、中译语通、万邦同和、微梦数据(新浪微博)、前海数据、海天瑞声、拓尔思、数据堂、智慧芽、网智天元、柏川数据、深信科技等数据商的数据集作为大模型算料。其中大部分算料为全国首发。 深数所人工智能行业有关人士表示,数据作为一个高效的“乘法”因子,能够与不同行业结合,显著提升行业的生产效率或创新能力,而人工智能技术则通过“加法”方式为传统产业带来渐进式的改进和优化,两者相互交织,共同成为数字经济发展的双翼。 “数据都是零散的,国产大模型厂商无法实现批量采集数据,我们此次推出的算料集就是,将大模型需要的训练数据进行逻辑的汇聚,从而形成了一个大模型训练...
- 下一篇
腾讯云4月8日故障复盘及情况说明
腾讯云就4月8日故障发布了复盘及情况说明。 4月8日15点23分,腾讯云团队发现云API服务异常,并收到大量客户反馈无法登录控制台。故障影响了依赖云API的公有云服务,如云函数、文字识别、微服务平台等,持续了近87分钟,期间共1957个客户报障。 以下为全文: 4月8日15点23分,腾讯云团队收到告警信息,云API服务处于异常状态;随即在腾讯云工单、售后服务群以及微博等渠道开始大量出现腾讯云控制台登录不上的客户反馈。 经过故障定位发现,客户登录不上控制台正是由云API异常所导致。云API是云上统一的开放接口集合,客户可以通过API以编程方式管理和操控云端资源,云控制台通过组合云API提供交互式的网页功能。 故障发生后,依赖云API提供产品能力的部分公有云服务,也因为云API的异常出现了无法使用的情况,比如云函数、文字识别、微服务平台、音频内容安全、验证码等。此次故障一共持续了近87分钟,期间共有1957个客户报障。 从客户的视角来看,云服务大概可以分为数据面和控制面,数据面承载客户自身的业务,控制面负责操作云上不同产品。比如目前使用最广泛的IaaS服务基本上都是以直接面向数据面为主,控...
相关文章
文章评论
共有0条评论来说两句吧...