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. conductor介绍

    https://netflix.github.io/conductor/ https://github.com/Netflix/conductor 编译版: https://jcenter.bintr ...

  2. jquery读取本地文件,Windows上报错。XMLHttpRequest cannot load xxx. Cross origin requests are only supported for protocol schemes: http, data, chrome, chrome-extension, https, chrome-extension-resource.k.cors.a.c

    问题: 测试报告,使用本地的json.txt文件,结果文件读取失败,报错如下: XMLHttpRequest cannot load xxx. Cross origin requests are on ...

  3. cin中函数的作用

    cin是istream类的对象,它是从标准输入设备(键盘)获取数据,程序中的变量通过流提取符">>"从流中提取数据.流提取符">>"从流 ...

  4. js Array Map and Set

    Array slice slice()就是对应String的substring()版本,它截取Array的部分元素,然后返回一个新的Array: var arr = ['A', 'B', 'C', ' ...

  5. Tomcat端口被占用解决方法

    端口被绑定,在命令提示符运行wmic process where "Caption='javaw.exe' and CommandLine like '%%bootstrap.jar%%'& ...

  6. swagger ui js 错误:Failed to execute 'serializeToString' on 'XMLSerializer': parameter 1 is not of type 'Node'.

    经过排查,引发此错误的原因是,表中有一个字段名称为“NodeName”,应该是在前台xml解析时引发冲突所致.我的解决办法是: 修改列名,修改映射. 如下: [Column("NodeNam ...

  7. Java WebService 知识点汇总

    java webservice 获取传入IP axis.jar    servlet.jar MessageContext mMsgContext = MessageContext.getCurren ...

  8. Xcode.Subproject.And.Framework

    1. Easy Xcode Static Library Subprojects and Submodules http://www.blog.montgomerie.net/easy-xcode-s ...

  9. Laravel Eloquent Model->isDirty() Function

    1 引言 introduction 有时,我们需要在 Model 某些属性发生变化时,作出相应的处理. 这时,我们可以使用 Model->isDirty() 方法进行判断. 2 场景 比如,姓名 ...

  10. 利用HBuilder打包前端开发webapp为apk

    转载 标签: apk / 打包 / vue 现在的前端开发可谓是,百花齐放啦,什么都可以做,只有想不到没有做不到的,今天就简单的介绍用vue,ng或者是react开发的单页应用如何打包为apk,在移动 ...