TransactionTemplate源码分析
来源:互联网 发布:深圳市软件产业基地5栋 编辑:程序博客网 时间:2024/05/17 21:48
出处:http://blog.csdn.net/itomge/article/details/9263181
事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。
事务应该具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
例如:spring的事务控制代码片段
- count = (Integer) transactionTemplate.execute(new TransactionCallback() {
- public Object doInTransaction(TransactionStatus status) {
- // 将原来的默认地址,取消默认设置
- receiveAddressDAO.updateDefaultAddressToUnDefault(memberId);
- // 更新地址
- int row = receiveAddressDAO.updateReceiveAddress(propertiesMap);
- if (row > 0) {
- return row;
- } else {
- // 抛出异常,回滚事务
- throw new RuntimeException(
- "[ReceiveAddressService] updateReceiveAddress failed. propertiesMap is "
- + propertiesMap);
- }
- }
- });
代码编写起来很简单,但是内部实现的原理是什么?
- public Object execute(TransactionCallback action) throws TransactionException {
- if (this.transactionManager instanceof CallbackPreferringPlatformTransactionManager) {
- return ((CallbackPreferringPlatformTransactionManager) this.transactionManager).execute(this, action);
- }
- else {
- TransactionStatus status = this.transactionManager.getTransaction(this);
- Object result = null;
- try {
- result = action.doInTransaction(status);
- }
- catch (RuntimeException ex) {
- // Transactional code threw application exception -> rollback
- rollbackOnException(status, ex);
- throw ex;
- }
- catch (Error err) {
- // Transactional code threw error -> rollback
- rollbackOnException(status, err);
- throw err;
- }
- this.transactionManager.commit(status);
- return result;
- }
- }
先了解execute方法的大致结构
其流程分为三部分:
1. 获取一个事务状态
2. 执行sql
3. 如果抛异常,rollbackOnException回滚事务;否则提交事务
4. 返回结果
1. 获取一个事务状态
从数据源获取一个新的连接
将连接的autoCommit属性设置为false
TransactionSynchronizationManager将(dataSource,连接)名值对作为线程变量保存起来。
Transaction对象也保存了连接的句柄
2. 执行sql
- // 将原来的默认地址,取消默认设置
- receiveAddressDAO.updateDefaultAddressToUnDefault(memberId);
- // 更新地址
- int row = receiveAddressDAO.updateReceiveAddress(propertiesMap);
- if (row > 0) {
- return row;
- } else {
- // 抛出异常,回滚事务
- throw new RuntimeException(
- "[ReceiveAddressService] updateReceiveAddress failed. propertiesMap is "
- + propertiesMap);
- }
3. 事务提交
最终还是调用com.mysql.jdbc.Connection.commit()方法,将数据持久化到数据库中。
其它就是一些清理工作
0 0
- TransactionTemplate源码分析
- TransactionTemplate源码分析
- 使用TransactionTemplate
- Spring TransactionTemplate demo!!!
- Spring 中的TransactionTemplate
- Spring 中的TransactionTemplate
- TransactionTemplate 事物模版
- JdbcTemplate and TransactionTemplate
- TransactionTemplate VS @transaction
- Spring 中的TransactionTemplate
- Spring 中的TransactionTemplate事务模板
- Spring TransactionTemplate + Mysql事务理解
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- 源码分析
- Ubuntu 下disk清理保护
- find 命令
- Unity3d发送邮件
- cocos2dx mac环境搭建
- 黑马程序员_面向对象_静态&单例
- TransactionTemplate源码分析
- MFC编程时的一些小知识(三)
- Centos Nginx+PHP+PHP-FPM安装使用YUM
- AS3常用动画效果公式集合
- MFC窗口初始化打开时窗口大小的设定
- netif_receive_skb 函数解析
- 程序员如何快速准备面试中的算法
- qt的资源替换搜索QDir详解
- java mail maven repository