原文地址:http://www.iteye.com/topic/1123049

1、问题
  1. Connection conn =
  2. DataSourceUtils.getConnection();
  3. //开启事务
  4. conn.setAutoCommit(false);
  5. try {
  6. Object retVal =
  7. callback.doInConnection(conn);
  8. conn.commit(); //提交事务
  9. return retVal;
  10. }catch (Exception e) {
  11. conn.rollback();//回滚事务
  12. throw e;
  13. }finally {
  14. conn.close();
  15. }
  1. Session session = null;
  2. Transaction transaction = null;
  3. try {
  4. session = factory.openSession();
  5. //开启事务
  6. transaction = session.beginTransaction();
  7. transation.begin();
  8. session.save(user);
  9. transaction.commit();//提交事务
  10. } catch (Exception e) {
  11. e.printStackTrace();
  12. transaction.rollback();//回滚事务
  13. return false;
  14. }finally{
  15. session.close();
  16. }

缺点:不一致的事务管理,复杂

 
2、高层次解决方案(编程式实现事务)
  1. public interface PlatformTransactionManager {
  2. TransactionStatus getTransaction(TransactionDefinition definition)
  3. throws TransactionException;
  4. void commit(TransactionStatus status) throws TransactionException;
  5. void rollback(TransactionStatus status) throws TransactionException;
  6. }
  1. //1.获取事务管理器
  2. PlatformTransactionManager txManager = (PlatformTransactionManager)
  3. ctx.getBean("txManager");
  4. //2.定义事务属性
  5. DefaultTransactionDefinition td = new DefaultTransactionDefinition();
  6. td.setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
  7. //3开启事务,得到事务状态
  8. TransactionStatus status = txManager.getTransaction(td);
  9. try {
  10. //4.执行数据库操作
  11. System.out.println(jdbcTempate.queryForInt("select count(*) from tbl_doc"));
  12. //5、提交事务
  13. txManager.commit(status);
  14. }catch (Exception e) {
  15. //6、回滚事务
  16. txManager.rollback(status);
  17. }
3、高层次解决方案(模板解决方案
  1. //1.获取事务管理器
  2. PlatformTransactionManager txManager = (PlatformTransactionManager)
  3. ctx.getBean("txManager");
  4. //2、定义事务管理的模板
  5. TransactionTemplate transactionTemplate = new TransactionTemplate(txManager);
  6. //3.定义事务属性
  7. transactionTemplate.
  8. setIsolationLevel(TransactionDefinition.ISOLATION_READ_COMMITTED);
  9. //4.回调,执行真正的数据库操作,如果需要返回值需要在回调里返回
  10. transactionTemplate.execute(new TransactionCallback() {
  11. @Override
  12. public Object doInTransaction(TransactionStatus status) {
  13. //5.执行数据库操作
  14. System.out.println(jdbcTempate.queryForInt("select count(*) from tbl_doc"));
  15. return null;
  16. }
  17. });
4、AOP解决方案
nSpring框架提供了一致的事务管理抽象,这带来了以下好处:
1:为复杂的事务API提供了一致的编程模型,如JTA、JDBC、Hibernate、JPA和JDO
2:支持声明式事务管理
3:提供比复杂的事务API(诸如JTA)更简单的、更易于使用的编程式事务管理API
4:非常好地整合Spring的各种数据访问抽象
 
实施事务的步骤
1、定义(资源)DataSource/SessionFactory……
2、定义事务管理器(管理资源的事务)
3、定义事务通知:定义了如何实施事务(实施事务的方法名和对应的事务属性),需要使用事务管理器管理事务,定义了如何选择目标对象的方法及实施的事务属性
4、定义advisor(切入点和事务通知):切入点选择需要实施事务的目标对象
5、Spring织入事务通知到目标对象(AOP代理)
 
实施流程:
 
 

 

 

最新文章

  1. 目前流行的源程序版本管理软件和项目管理软件都有哪些?各有什么优缺点?以及Github的注册过程
  2. MySQL 存储过程实例 与 ibatis/mybatis/hibernate/jdbc 如何调用存储过程
  3. ios 常用的小框架
  4. WinScp上传和下载
  5. 关于java异常的一点思考
  6. Using Swift with Cocoa and Objective-C(Swift 2.0版):开始--基础设置-备
  7. LR如何监控tomcat性能
  8. Linux上配置Nginx+PHP5(FastCGI)
  9. js事件对象
  10. [C++]现行的试卷封面并获取学生题目得分信息以及学号信息的原型系统
  11. Linux系统下安装Mysql5.7.18教程收集分享
  12. 带三方登录(qq,微信,微博)
  13. Golang中WaitGroup使用的一点坑
  14. element-ui隐藏组件scrollbar的使用
  15. maven项目pom.xml第一行报错
  16. SpringMVC教程1
  17. e3.7.2-MyEclipse-10.7安装SVN插件
  18. visual studio 2015下使用gcc调试linux c++开发环境搭建完整详解
  19. 唯品会海量实时OLAP分析技术升级之路
  20. 如何提升ACTION_SIM_STATE_CHANGED的接收速度?

热门文章

  1. 获取IP地址 & 伪装IP地址发送请求
  2. jQuery最基础最全面的选择器大览
  3. table布局, td内部元素溢出边界问题。 (已解决)
  4. C# WinForm 中英文实现, 国际化实现的简单方法
  5. Window平台Grmon下如何使用gdb进行调试
  6. 搭建Linux+Jexus+MariaDB+ASP.NET[LJMA]环境
  7. UWP中重用C/C++代码时踩过的一些坑
  8. Lesson 6 Percy Buttons
  9. Hadoop学习笔记—13.分布式集群中节点的动态添加与下架
  10. golang reflect