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

需要写模板代码,我们知道事务其实是一个切面,因此我们通过AOP来解决

 
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代理)
 

对Spring 容器管理事务支持的总结的更多相关文章

  1. 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别。

    基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)到底有什么区别. 我还是喜欢基于Schema风格的Spring事务管理,但也有很多人在用基于@Tras ...

  2. Spring -- <tx:annotation-driven>注解基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional)的区别。

    借鉴:http://jinnianshilongnian.iteye.com/blog/1508018 基于JDK动态代理和CGLIB动态代理的实现Spring注解管理事务(@Trasactional ...

  3. 如何在自定义Listener(监听器)中使用Spring容器管理的bean

    正好以前项目中碰到这个问题,现在网上偶然又看到这个问题的博文,那就转一下吧. 原文:http://blog.lifw.org/post/46428852 感谢作者 另外补充下:在web Server容 ...

  4. Spring框架(管理事务)

    Spring底层使用Transaction事物模板来进行操作.具体操作: 1.service 需要获得 TransactionTemplate 2.spring 配置模板,并注入给service 3. ...

  5. 为什么不在spring容器管理controller

    Spring容器与SpringMVC容器 1.疑问:为什么不用spring去管理所有类? 我们配置springMVC 中,为什么controller不直接交给spring 管理而要spring MVC ...

  6. Spring Redis开启事务支持错误用法导致服务不可用

      1.事故背景 在APP访问服务器接口时需要从redis中获取token进行校验,服务器上线后发现一开始可以正常访问,但只要短时间内请求量增长服务则无法响应 2.排查流程 (1)使用top指令查看C ...

  7. Spring怎么管理事务?

    我们一般通过aop管理事务,就是把代码看成一个纵向有序的,然后通过aop管理事务,就好比增删改的时候需要开启一个事务,我们给他配置一个required,required就是有事务就执行事务,没有就给他 ...

  8. Spring容器管理各种文件

    1. 导入文件 <import resource="applicationContext-dataSource.xml" /> 2. 引用资源配置文件 <cont ...

  9. 使用 Spring 容器管理 Filter

    当我们用Filter时,往往需要使用一些辅助的service,在普通的java中,只要声明(set,get方法)后在spring-application配置文件中配置就可以了,但是由于Filter与L ...

随机推荐

  1. dp-最长公共子序列

    最长公共子序列(NYOJ36) 时间限制:3000 ms  |  内存限制:65535 KB 难度:3   描述 咱们就不拐弯抹角了,如题,需要你做的就是写一个程序,得出最长公共子序列.tip:最长公 ...

  2. 西南交通大学结构服役安全及力学基础创新团队在Wiley出版英文专著(转载)

    近日,西南交通大学力学与工程学院康国政教授与阚前华副教授受邀由John Wiley & Sons Ltd公司出版了英文专著 “Cyclic plasticity of Engineering  ...

  3. Python bytearray() 函数

    Python bytearray() 函数  Python 内置函数 描述 bytearray() 方法返回一个新字节数组.这个数组里的元素是可变的,并且每个元素的值范围: 0 <= x < ...

  4. LibreOJ 6282 数列分块入门 6(在线插入在线查询)

    题解:还是分块,将每个块存入vector,然后在插入的时候就是sqrt(n)级的重构,如果块太大了,暴力将这个块拆开. 代码如下: #include<cmath> #include< ...

  5. 4sum, 4sum closest

    4sum [抄题]: [思维问题]: 以为很复杂,其实是“排序+双指针”的最高阶模板 [一句话思路]: [输入量特别大怎么办]: [画图]: [一刷]: 先排序! if (i > 0 & ...

  6. Extjs面板和布局初探

    面板相当于一张干净的白纸,如果直接在上面添加内容,将很难控制面板中内容的显示位置,面板元素越多就越显得凌乱,所以需要在面板上划分不同的区域,将面板内容展示到希望的位置上.ExtJS通过提供多种布局类来 ...

  7. Spring框架的事务管理之基于AspectJ的XML方式(重点掌握)

    1. 步骤一:恢复转账开发环境(转账开发环境见“https://www.cnblogs.com/wyhluckdog/p/10137283.html”) 2.步骤二:引入AOP的开发包3.步骤三:引入 ...

  8. 面向对象设计模式纵横谈:Builder 生成器模式(笔记记录)

    Builder模式的缘起 假设创建游戏中的一个房屋House设施,该房屋的构建由几个部分组成,且各个部分要富于变化. 如果使用最直观的设计方法,每一个房屋部分的变化,都将导致房屋构建的重新修正…… 动 ...

  9. Ubuntu12.04添加环境变量

    环境变量分为系统级和用户级. 系统级变量设置环境为/etc/environment和/etc/profile等,不要轻易修改,否则可能造成系统错误. 用户级变量设置路径为-/.bashrc和~/.pr ...

  10. 2018.09.05 bzoj1010: [HNOI2008]玩具装箱toy(斜率优化dp)

    传送门 一道经典的斜率优化dp. 推式子ing... 令f[i]表示装前i个玩具的最优代价. 然后用老套路. 我们只考虑把第j+1" role="presentation" ...