第一范文网 - 专业文章范例文档资料分享平台

Spring对于事物的管理

来源:用户分享 时间:2025/9/18 10:59:39 本文由loading 分享 下载这篇文档手机版
说明:文章内容仅供预览,部分内容可能不全,需要完整文档或者需要复制内容,请下载word后使用。下载word有问题请添加微信号:xxxxxxx或QQ:xxxxxx 处理(尽可能给您提供完整文档),感谢您的支持与谅解。

13. //回滚事务

14. con.rollback(); 15. }

16. finally{ 17. //释放资源 18. closeCon(); 19. } 20. }

Spring保证在methodB方法中所有的调用都获得到一个相同的连接。在调用methodB时,没有一个存在的事务,所以获得一个新的连接,开启了一个新的事务。

单独调用MethodA时,在MethodA内又会调用MethodB.

执行效果相当于 Java代码

1. main{

2. Connection con = null; 3. try{

4. con = getConnection(); 5. methodA(); 6. con.commit(); 7. }

8. cathc(RuntimeException ex){ 9. con.rollback(); 10. }

11. finally{

12. closeCon(); 13. } 14. }

调用MethodA时,环境中没有事务,所以开启一个新的事务. 当在MethodA中调用MethodB时,环境中已经有了一个事务,所以methodB就加入当前事务。

PROPAGATION_SUPPORTS 如果存在一个事务,支持当前事务。如果没有事务,则非事务的执行。但是对于事务同步的事务管理器,PROPAGATION_SUPPORTS与不使用事务有少许不同。

Java代码

1. //事务属性 PROPAGATION_REQUIRED

2. methodA(){ 3. methodB(); 4. } 5.

6. //事务属性 PROPAGATION_SUPPORTS 7. methodB(){ 8. …… 9. }

单纯的调用methodB时,methodB方法是非事务的执行的。

当调用methdA时,methodB则加入了methodA的事务中,事务地执行。

PROPAGATION_MANDATORY 如果已经存在一个事务,支持当前事务。如果没有一个活动的事务,则抛出异常。

Java代码

1. //事务属性 PROPAGATION_REQUIRED 2. methodA(){ 3. methodB(); 4. } 5.

6. //事务属性 PROPAGATION_MANDATORY 7. methodB(){ 8. …… 9. }

当单独调用methodB时,因为当前没有一个活动的事务,则会抛出异常

throw new IllegalTransactionStateException(\propagation 'mandatory' but no existing transaction found\

当调用methodA时,methodB则加入到methodA的事务中,事务地执行。

PROPAGATION_REQUIRES_NEW 总是开启一个新的事务。如果一个事务已经存在,则将这个存在的事务挂起。

Java代码

1. //事务属性 PROPAGATION_REQUIRED 2. methodA(){

3. doSomeThingA(); 4. methodB();

5. doSomeThingB(); 6. }

7.

8. //事务属性 PROPAGATION_REQUIRES_NEW 9. methodB(){ 10. …… 11. }

当单独调用methodB时,相当于把methodb声明为REQUIRED。开启一个新的事务,事务地执行。

当调用methodA时 Java代码

1. main(){

2. methodA(); 3. }

情况有些大不一样.相当于下面的效果。 Java代码

1. main(){

2. TransactionManager tm = null; 3. try{

4. //获得一个JTA事务管理器

5. tm = getTransactionManager(); 6. tm.begin();//开启一个新的事务

7. Transaction ts1 = tm.getTransaction(); 8. doSomeThing();

9. tm.suspend();//挂起当前事务 10. try{

11. tm.begin();//重新开启第二个事务

12. Transaction ts2 = tm.getTransaction(); 13. methodB();

14. ts2.commit();//提交第二个事务 15. 16. }

17. Catch(RunTimeException ex){

18. ts2.rollback();//回滚第二个事务 19. }

20. finally{ 21. //释放资源 22. }

23. //methodB执行完后,复恢第一个事务 24. tm.resume(ts1); 25. doSomeThingB();

26. ts1.commit();//提交第一个事务

27. }

28. catch(RunTimeException ex){

29. ts1.rollback();//回滚第一个事务 30. }

31. finally{ 32. //释放资源 33. } 34. }

在这里,我把ts1称为外层事务,ts2称为内层事务。从上面的代码可以看出,ts2与ts1是两个独立的事务,互不相干。Ts2是否成功并不依赖于ts1。如果methodA方法在调用methodB方法后的doSomeThingB方法失败了,而methodB方法所做的结果依然被提交。而除了methodB之外的其它代码导致的结果却被回滚了。

使用PROPAGATION_REQUIRES_NEW,需要使用JtaTransactionManager作为事务管理器。

PROPAGATION_NOT_SUPPORTED 总是非事务地执行,并挂起任何存在的事务。

Java代码

1. //事务属性 PROPAGATION_REQUIRED 2. methodA(){

3. doSomeThingA(); 4. methodB();

5. doSomeThingB(); 6. } 7.

8. //事务属性 PROPAGATION_NOT_SUPPORTED 9. methodB(){ 10. …… 11. }

当单独调用methodB时,不启用任何事务机制,非事务地执行。 当调用methodA时,相当于下面的效果

Java代码

1. main(){

2. TransactionManager tm = null; 3. try{

4. //获得一个JTA事务管理器

5. tm = getTransactionManager(); 6. tm.begin();//开启一个新的事务

搜索更多关于: Spring对于事物的管理 的文档
Spring对于事物的管理.doc 将本文的Word文档下载到电脑,方便复制、编辑、收藏和打印
本文链接:https://www.diyifanwen.net/c75a531oo6h6et871e25u_2.html(转载请注明文章来源)
热门推荐
Copyright © 2012-2023 第一范文网 版权所有 免责声明 | 联系我们
声明 :本网站尊重并保护知识产权,根据《信息网络传播权保护条例》,如果我们转载的作品侵犯了您的权利,请在一个月内通知我们,我们会及时删除。
客服QQ:xxxxxx 邮箱:xxxxxx@qq.com
渝ICP备2023013149号
Top