博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
Spring学习(七)—事务管理的实现
阅读量:4626 次
发布时间:2019-06-09

本文共 3665 字,大约阅读时间需要 12 分钟。

1、编程式事务

先配置事务管理器:

5
30
10
60
5
0
60
30
true
false

 

1.1 PlatformTransactionManager

其业务代码:

@Resource      private PlatformTransactionManager txManager;      @Resource      private  DataSource dataSource;      private static JdbcTemplate jdbcTemplate;       private static final String INSERT_SQL = "insert into user(id) values(?)";      private static final String COUNT_SQL = "select count(*) from user";      @Test      public void testdelivery(){          //定义事务隔离级别,传播行为,          DefaultTransactionDefinition def = new DefaultTransactionDefinition();            def.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);            def.setPropagationBehavior(TransactionDefinition.PROPAGATION_REQUIRED);            //事务状态类,通过PlatformTransactionManager的getTransaction方法根据事务定义获取;获取事务状态后,Spring根据传播行为来决定如何开启事务          TransactionStatus status = txManager.getTransaction(def);            jdbcTemplate = new JdbcTemplate(dataSource);          int i = jdbcTemplate.queryForInt(COUNT_SQL);            System.out.println("插入前表中记录总数:"+i);          try {                jdbcTemplate.update(INSERT_SQL, "1");                txManager.commit(status);  //提交status中绑定的事务          } catch (RuntimeException e) {                txManager.rollback(status);  //回滚          }            i = jdbcTemplate.queryForInt(COUNT_SQL);            System.out.println("插入后表中记录总数:"+i);      }

直接使用PlatformTransactionManager的优点:可以完全控制整个事务的过程。缺点也很明显,从应用程序开发的角度来看,其依然过于底层,全使用该方法管理事务,重复代码量也是惊人的。

鉴于使用PlatformTransactionManager进行事务管理流程比较固定,可以考虑像Spring的数据访问那样,使用模版方法模式与Callback相结合的方式,对直接使用PlatformTransactionManager的代码进行封装,于是就有了TransactionTemplate的管理事务的方式。

1.2 TransactionTemplate

jdbcTemplate = new JdbcTemplate(dataSource);      int i = jdbcTemplate.queryForInt(COUNT_SQL);        System.out.println("表中记录总数:"+i);      //构造函数初始化TransactionTemplate      TransactionTemplate template = new TransactionTemplate(txManager);      template.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);        //重写execute方法实现事务管理      template.execute(new TransactionCallbackWithoutResult() {          @Override          protected void doInTransactionWithoutResult(TransactionStatus status) {              jdbcTemplate.update(INSERT_SQL, "中文");   //字段为int型,所以插入肯定失败报异常,自动回滚,代表TransactionTemplate自动管理事务          }}      );      i = jdbcTemplate.queryForInt(COUNT_SQL);        System.out.println("表中记录总数:"+i);

Spring针对TransactionTemplate提供了两个Callback接口,TransactionCallback和TransactionCallbackWithoutResult,二者的唯一区别式是否需要返回结果。

TransactionTemplate会捕捉事务操作中的unchecked exception并进行回滚事务,然后异常抛给上层处理。所以我们只需要处理特定于应用程序异常即可。

2.声明式事务

 

转载于:https://www.cnblogs.com/liyuxinBlog/p/8412933.html

你可能感兴趣的文章
java类路径classpath和包
查看>>
Oracler读取各种格式的相关日期格式
查看>>
Python学习札记(三十六) 面向对象编程 Object Oriented Program 7 __slots__
查看>>
iOS 时间和时间戳之间转化
查看>>
【整理】C#文件操作大全(SamWang)
查看>>
如何从数据库生成 EF Code First model
查看>>
box2dweb基础
查看>>
2013年3月4号
查看>>
jQuery 模拟 ubuntu 3D desktop 的 Dodge Effect 效果
查看>>
QT Creator 快速入门教程 读书笔记(一)
查看>>
CNN之yolo目标检测算法复习总结
查看>>
day17,模块的导入
查看>>
JavaScript网站设计实践(三)设计有特色的主页,给主页链接添加JavaScript动画脚本...
查看>>
Windows系统架构
查看>>
单链表上查找算法的实现(0955) swust-oj
查看>>
AU版有锁机的福利,704越狱彻底解决+86问题,完美IM/FT,重启不掉APN设置
查看>>
PCA的数学原理
查看>>
Flask Web Development —— Web表单(上)
查看>>
Struts2标签
查看>>
PHP知识结构
查看>>