spring事务(Transaction )报 marked as rollback-only异常的原因及解决方法
来源:互联网 发布:mac版flashcs6汉化包 编辑:程序博客网 时间:2024/06/05 18:40
很多朋友在使用spring+hibernate或mybatis等框架时经常遇到报Transaction rolled back because it has been marked as rollback-only的异常,这个异常是怎么造成的
呢,下面将给大家进行详细的分析。
这是专门写的一个造成该异常的代码:
@Transactionalpublic void add(OperateLog entity)throws Exception {// TODO Auto-generated method stuboperateLogDao.add(entity);}
@Transactionalpublic void save(Member member) throws Exception {memberDao.add(member);}@Transactionalpublic void add(Member member) throws Exception {try {this.save(member);/* * 日志的title长度为10 我把值设置为add111111111111111111是为了造成异常 */OperateLog entity = new OperateLog("add111111111111111111", "1111");operateLogService.add(entity);} catch (Exception e) {e.printStackTrace();// throw e;}}执行以上代码就会报改异常,当我把
//throw e;的注释//去掉,当我执行后就不会有改异常,只会报标题title太长的异常。如下面提示:
Caused by: com.mysql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column '_title' at row 1at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4072)at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2719)at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2450)at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2371)at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2355)at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)at org.apache.commons.dbcp.DelegatingPreparedStatement.executeUpdate(DelegatingPreparedStatement.java:105)at org.hibernate.id.IdentityGenerator$GetGeneratedKeysDelegate.executeAndExtract(IdentityGenerator.java:94)at org.hibernate.id.insert.AbstractReturningDelegate.performInsert(AbstractReturningDelegate.java:57)
通过以上的问题我们可以发现。在spring中,在事务方法中调用多个事务方法时,spring将会把这些事务合二为一。当整个方法中每个子方法没报错时,整个方法执行完才提交事务(大家可以使用debug测试),如果某个子方法有异常,spring将该事务标志为rollback only。如果这个子方法没有将异常往上整个方法抛出或整个方法未往上抛出,那么改异常就不会触发事务进行回滚,事务就会在整个方法执行完后就会提交,这时就会造成Transaction rolled back because it has been marked as rollback-only的异常,就如上面代码中未抛throw e 一样。如果我们往上抛了改异常,spring就会获取异常,并执行回滚。
6 1
- spring事务(Transaction )报 marked as rollback-only异常的原因及解决方法
- spring的事务中程序控制事务成功失败(Transaction marked as rollback)
- spring的事务中程序控制事务成功失败(Transaction marked as rollback)
- spring事务 Transaction rolled back because it has been marked as rollback-only
- JPA出现Transaction marked as rollback only异常 总结
- java异常:Transaction rolled back because it has been marked as rollback-only
- Transaction rolled back because it has been marked as rollback-only异常
- Spring事务异常rollback-only
- 【Spring】21、用spring目标对象处理Transaction rolled back because it has been marked as rollback-only
- Activity工作流流转条件报错Transaction rolled back because it has been marked as rollback-only
- Spring事务异常rollback-only 笔记
- Transaction rolled back because it has been marked as rollback-only
- Transaction rolled back because it has been marked as rollback-only
- Transaction rolled back because it has been marked as rollback-only
- Transaction rolled back because it has been marked as rollback-only
- Transaction rolled back because it has been marked as rollback-only
- UnexpectedRollbackException: Transaction rolled back because it has been marked as rollback-only
- Transaction rolled back because it has been marked as rollback-only
- 设计之路:如何进行软件需求分析?
- Install plantuml on Mac OSX
- Linux基础学习笔记一
- Jpush使用总结
- HDU 1251 (统计难题) 字典树模板&&map实现
- spring事务(Transaction )报 marked as rollback-only异常的原因及解决方法
- hadoop学习笔记之<Call From localhost/127.0.0.1 to localhost:9000 failed...>
- iOS中copy属性与setter赋值
- 买房相关
- 链表不具备的特点
- HDU-1029 Ignatius and the Princess IV
- Java-Spring-WebService最基础的配置示例
- java内存分配和String类型的深度解析
- like语句‘%%'