- 浏览: 1130560 次
- 性别:
- 来自: 北京
文章分类
- 全部博客 (411)
- Java Foundation (41)
- AI/机器学习/数据挖掘/模式识别/自然语言处理/信息检索 (2)
- 云计算/NoSQL/数据分析 (11)
- Linux (13)
- Open Source (12)
- J2EE (52)
- Data Structures (4)
- other (10)
- Dev Error (41)
- Ajax/JS/JSP/HTML5 (47)
- Oracle (68)
- FLEX (19)
- Tools (19)
- 设计模式 (4)
- Database (12)
- SQL Server (9)
- 例子程序 (4)
- mysql (2)
- Web Services (4)
- 面试 (8)
- 嵌入式/移动开发 (18)
- 软件工程/UML (15)
- C/C++ (7)
- 架构Architecture/分布式Distributed (1)
最新评论
-
a535114641:
LZ你好, 用了这个方法后子页面里的JS方法就全不能用了呀
页面局部刷新的两种方式:form+iframe 和 ajax -
di1984HIT:
学习了,真不错,做个记号啊
Machine Learning -
赵师傅临死前:
我一台老机器,myeclipse9 + FB3.5 可以正常使 ...
myeclipse 10 安装 flash builder 4.6 -
Wu_Jiang:
触发时间在将来的某个时间 但是第一次触发的时间超出了失效时间, ...
Based on configured schedule, the given trigger will never fire. -
cylove007:
找了好久,顶你
Editable Select 可编辑select
Spring、EJB的声明式事务默认情况下都是在抛出unchecked exception后才会触发事务的回滚
测试用业务逻辑方法:
关于TransactionProxyFactoryBean的transactionAttributes中字符串的值(定义自TransactionAttributeEditor):
is a transaction attribute descriptors that parsed via TransactionAttributeEditor
见本博客:http://wuaner.iteye.com/admin/blogs/567792
单元测试代码:
将异常捕获,并且在catch块中不对事务做显式提交(或其他应该做的操作如关闭资源等)=生吞掉异常
spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常).
如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。
一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足。
由此可以推知,在spring中如果某个业务方法被一个
整个包裹起来,则这个业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出!全被捕获并吞掉,导致spring异常抛出触发事务回滚策略失效。
不过,如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回滚,这样写也未尝不可。
采用页面硬编码的方式使用spring api对事务做显式的回滚。
测试用业务逻辑方法:
/** * 如果在spring事务配置中不为切入点(如这里的切入点可以定义成test*)配置事务在什么情况下回滚(格式:-引起回滚的异常类型) * 则spring默认只会在service方法抛出unchecked exception才会触发回滚 */ public class TestServiceImpl extends Service implements TestService { /** * 测试spring异常触发事务回滚的service方法 */ public void testAddPerson(String name) throws Exception { TestPerson p = new TestPerson(); p.setName(name); this.getHibernateGenericController().save(p); /* * 制造RuntimeException * 在spring默认的异常回滚策略下,该异常的抛出会触发事务的回滚,数据不会被插入 */ throw new RuntimeException("抛出个运行时异常"); /** * 同样是unchecked exception,spring默认的异常回滚策略下Error的抛出也会触发事务的回滚,数据不会被插入 */ // throw new Error(); /** * 即使是在spring默认的异常触发事务回滚策略(unchecked exception触发回滚)下, * 如果使用try-catch捕获抛出的unchecked异常后没有在catch块中采用页面硬编码的方式使用spring api对事务做显式的回滚,则事务不会回滚,数据被插入 * “将异常捕获,并且在catch块中不对事务做显式提交=生吞掉异常” */ // try { // throw new RuntimeException("这个抛出的运行时异常会被try-catch捕获"); // } catch(Exception e) { // System.out.println("捕获到异常: " + e.getMessage()); // } /** * 因为Exception类是个checked exception,所以这里抛出的异常不会触发事务的回滚,数据被插入 */ // throw new Exception("a Exception instance"); /** * 该BaseException继承自Exception,也为checked exception,抛出它后: * spring默认的回滚策略下,事务未回滚, 数据被插入; * 在TransactionProxyFactoryBean的transactionAttributes中配置 <prop key="test*"> ... ...,-BaseException </prop> 后,事务回滚,数据未被插入 */ // throw new BaseException("一个BaseException"); } }
关于TransactionProxyFactoryBean的transactionAttributes中字符串的值(定义自TransactionAttributeEditor):
is a transaction attribute descriptors that parsed via TransactionAttributeEditor
见本博客:http://wuaner.iteye.com/admin/blogs/567792
单元测试代码:
public class TestSpringDefaultRollback extends TestCase { private static ApplicationContext context = new ClassPathXmlApplicationContext("resource/xxx/applicationContext.xml"); public void testDefaultRollback() throws Exception{ TestService testServiceImpl = (TestService)context.getBean("testService"); testServiceImpl.testAddPerson("张三"); } }
将异常捕获,并且在catch块中不对事务做显式提交(或其他应该做的操作如关闭资源等)=生吞掉异常
spring的事务边界是在调用业务方法之前开始的,业务方法执行完毕之后来执行commit or rollback(Spring默认取决于是否抛出runtime异常).
如果抛出runtime exception 并在你的业务方法中没有catch到的话,事务会回滚。
一般不需要在业务方法中catch异常,如果非要catch,在做完你想做的工作后(比如关闭文件等)一定要抛出runtime exception,否则spring会将你的操作commit,这样就会产生脏数据.所以你的catch代码是画蛇添足。
由此可以推知,在spring中如果某个业务方法被一个
try { //bisiness logic code } catch(Exception e) { //handle the exception }
整个包裹起来,则这个业务方法也就等于脱离了spring事务的管理,因为没有任何异常会从业务方法中抛出!全被捕获并吞掉,导致spring异常抛出触发事务回滚策略失效。
不过,如果在catch代码块中采用页面硬编码的方式使用spring api对事务做显式的回滚,这样写也未尝不可。
评论
5 楼
geyaandy
2012-11-04
如果我要在catch块中 再次操作数据库(插入) (同一个连接) 能成功么
4 楼
龙腾盛世
2012-07-19
3 楼
Wuaner
2011-04-16
yuanyuan7891 写道
如果我在catch块中需要return数据又要spring回滚事务,要怎么办啊?
采用页面硬编码的方式使用spring api对事务做显式的回滚。
2 楼
yuanyuan7891
2011-04-16
如果我在catch块中需要return数据又要spring回滚事务,要怎么办啊?
1 楼
yuanyuan7891
2011-04-16
终于知道为什么我的事务没有处理了,原来被我在catch块中处理掉了,没有抛出异常啊。
发表评论
-
Lucene & Solr
2013-05-07 17:30 2370Params of solr query (参见 solrj ... -
Continuous Integration Server:Jenkins & Hudson
2013-04-15 16:15 1422Jenkins: http://jenkins-ci.org/ ... -
Spring Integration
2013-03-26 16:52 3006Spring Integration Reference ... -
高可用与负载均衡:Haproxy(or lVS) + keepalived
2013-01-29 20:35 3111sources: Setting Up A High ... -
Spring Batch: 大数据量批量并行处理框架
2013-01-11 16:19 4804Spring Batch Documentati ... -
AOP: Aspect Oriented Programming
2013-01-06 11:13 2750The AspectJ Programming Gu ... -
Performance & Load test tool : JMeter
2012-12-18 14:28 1248Official: http://jmeter.apa ... -
rabbitmq & spring amqp
2012-12-04 00:09 8660My main AMQP post on blogger ... -
javaMail 邮件
2012-11-23 20:14 3435SMTP POP3的区别到底是什么? http://w ... -
未完 Spring MVC
2012-11-15 22:41 2067Annotations for Http pa ... -
JUnit 单元测试
2012-10-30 12:27 2525测试的分类: http://s ... -
Hibernate
2011-08-02 11:48 1128Hibernate缓存: 一级缓存的生命周期和session的 ... -
Maven Repository Management & Nexus
2011-07-30 11:39 1368Why do I need a Repositor ... -
XStream
2011-07-13 00:18 1331XStream 内置 Converters: http://x ... -
Hibernate注解: 联合主键:@IdClass vs @EmbeddedId
2011-07-12 21:01 15313Hibernate Annotations -> 2.2 ... -
Struts2 Tag 标签
2011-05-04 00:43 1598struts2 OGNL 中的#、%等符号的区别: Apach ... -
Spring
2011-04-07 19:10 2841Spring API & Reference: htt ... -
iBATIS cacheModel 缓存
2011-04-07 14:29 1296http://ibatis.apache.org/docs/d ... -
Template Engine: FreeMarker & Velocity
2011-01-16 22:56 4054FreeMarker http://freemar ... -
Struts2 标签 <s:url>中添加多个<s:param>的奇怪问题 待整理
2011-01-14 13:27 1862问题描述(我的回复): http://went3456.ite ...
相关推荐
自己做的一个简单的spring运用实例,主要是关于事务回滚的一个小例子,希望对还在纠结事务回滚的童靴有点帮助。。。
花了一晚上时间终于搞出来了Spring整合Mybatis事务回滚(Mysql数据库),控制Service层中的多次插入操作,多次操作整体是一个事务。 里面有缘嘛和jar包,资源为war包,导入即可。运行Test类中的测试代码即可。 建表...
Spring/SpringMVC/MyBatis整合,可事务回滚
1. 基于Aspectj实现动态数据源...6. 实现事务内切换数据源(支持原生Spring声明式事务哟,仅此一家),并支持多数据源事务回滚(有了它除了跨服务的事务你需要考虑分布式事务,其他都不需要,极大的减少了系统的复杂程度)
Spring中@Transactional事务回滚(含实例详细讲解,附源码)Java开发Java经验技巧共8页.pdf.zip
Spring中的JdbcTemplate,Spring中的的事务.。。。。。。。
集成了Spring 3.2.2 Hibernate 3.3.2 Struts 2.3.4 用JPA的注解实现orm 不用创建数据库表 只需本机上有oracle即可 用JSR注解进行Spring的...用Spring Test整合Junit4 进行测试并自动事务回滚 不对数据库造成持久化操作
Spring中的@Transactional事物回滚实例源码
主要介绍了Spring异常捕获且回滚事务解决方案,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下
主要给大家介绍了关于mongoDB 4.0事务回滚的相关资料,文中通过示例代码介绍的非常详细,对大家学习或者使用MongoDB具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
本篇文章主要介绍了浅谈Spring中@Transactional事务回滚及示例(附源码),小编觉得挺不错的,现在分享给大家,也给大家做个参考。一起跟随小编过来看看吧
关于SpringMyBatis纯注解事务不能提交的问题分析与解决
主要介绍了spring事务异常回滚实例解析,具有一定借鉴价值,需要的朋友可以参考下
Spring事务管理A方法内部调用B方法的回滚问题测试代码
Spring的事务管理默认只对出现运行期异常(java.lang.RuntimeException及其子类)进行回滚,需要了解更多Spring事务方面的知识,可详看本
spring boot 纯注解方法事务控制回滚,注解+简单配置文件使用多线程demo
使用MySQL时,如果发现事务无法回滚,但Hibernate、Spring、JDBC等配置又没有明显问题,到底是什么原因,下面与大家分享下
主要介绍了java Spring事务回滚的相关资料,需要的朋友可以参考下
Spring Cloud Gateway中的全局异常处理不能直接用@ControllerAdvice来处理,通过跟踪异常信息的抛出,找到对应的源码,自定义一些处理逻辑来符合业务的需求。 网关都是给接口做代理转发的,后端对应的都是REST API,...