起因

学习Spring的时候就知道aop有一个应用是声明式注解..反正往Service上一丢@Transactional就完事了..不用自己去开启hibernate的session,很简单.

但是@Transactional里有很多属性一直没有用过...其中最让我在意的便是Propagation属性...其他属性都还是蛮好理解的..但是这个属性一直不怎么懂,也一直没怎么去研究..

大部分情况下的确是使用@Transactional不用额外设置就OK了.因为默认的Propagation是Propagation.REQUIRED.那其他的Propagation到底有什么作用呢?

网上的介绍都大同小异..只有一些简单的介绍..看的我还是有点晕...所以我实践了一下...贴出实验结果...

实验步骤

我主要实验了3种情况..这三种情况我觉得是最容易弄错的...其他的Propagation还是比较好理解的...

具体实验步骤是我写了2个嵌套的Service.外侧的Service用的是Propagation.REQUIRED.内侧的Service分别试了Propagation.REQUIRED, Propagation.REQUIRES_NEW 和 Propagation.NESTED

请注意外层Service在调用内层Service的时候用了trycatch..不然内层抛出异常外层不处理的话也会抛出异常.

我的Service看起来是这样的:

     @Transactional(propagation = Propagation.REQUIRED)
public void operate1() {
House s = new House();
s.setName("841o1");
repository.save(s);
try{
service.operate2();
}catch (Exception e) {
e.printStackTrace();
}
House s3 = new House();
s3.setName("843o1");
repository.save(s3);
throw new RuntimeException();
}
     @Transactional(propagation = Propagation.NESTED)
public void operate2() {
House s = new House();
s.setName("842o2");
repository.save(s);
//throw new RuntimeException();
}

流程就是外侧Service保存对象1,内侧Service保存对象2,外侧Service保存对象3

实验结果

  外层Service抛出异常 内层Service抛出异常
内层Service是Propagation.REQUIRED 对象1,2,3全部回滚 对象1,2,3全部回滚
内层Service是Propagation.REQUIRES_NEW  对象1,3回滚,2成功提交 对象1,3提交成功,2回滚
内层Service是Propagation.NESTED 对象1,2,3全部回滚 对象1,3提交成功,2回滚

结论

Propagation.REQUIRED : 内外层事务可以看成是同一个事务,一起commit,或者一起rollback.

Propagation.REQUIRES_NEW : 内外层事务完全不相关, 就是2个事务

Propagation.NESTED : 外层事务commit内层事务才可能commit,外层事务rollback内层事务一定rollback..外层事务commit,内层事务仍然可能会rollback

另外:

我用Spring data jpa实验Propagation.NESTED的时候提示我jpa的实现(hibernate)不支持savepoint.

我直接用hibernate的时候就可以,但是要设置org.springframework.orm.hibernate4.HibernateTransactionManager的nestedTransactionAllowed属性为true

最新文章

  1. CSharpGL(23)用ComputeShader实现一个简单的ParticleSimulator
  2. jsp的九大内置对象
  3. 百度地图API 批量添加 带检索功能的信息窗口
  4. 单点登录实现----CAS(一)
  5. Stanford大学机器学习公开课(二):监督学习应用与梯度下降
  6. JDBC进行批处理
  7. cxf数据压缩
  8. 在artTemplate的标签中使用外部函数的方法
  9. ASP.NET验证控件详解
  10. Sql Server 列转行 Pivot使用
  11. 【原创】JPEG图像密写研究(三) 数据流译码
  12. python 架构简介(转)
  13. [Q]“获取AutoCAD安装信息时失败...”解决方法
  14. 洛谷 P3410 拍照
  15. sphinx的再创造coreseek的安装过程
  16. Caffe+VS2015+python3的安装(基于windows)
  17. caffe win添加新层
  18. Spring Boot - AMQP 消息中间件
  19. Mudo C++网络库第二章学习笔记
  20. pygame-KidsCanCode系列jumpy-part16-enemy敌人

热门文章

  1. Oracle/PLSQL: ORA-06550
  2. 读取properties配置文件的方法
  3. MySql踩坑总结
  4. NFS服务器搭建——可用于共享文件或负载均衡文件共享服务器使用
  5. PhpStorm 相关激活方式
  6. vim快捷键
  7. 给Eclipse提速的7个技巧
  8. sqlServer、MySql批量操作插件
  9. [LeetCode] Water and Jug Problem 水罐问题
  10. [LeetCode] Unique Binary Search Trees 独一无二的二叉搜索树