spring事务(Transaction)报markedasrollback-only异常。。
很多朋友在使⽤spring+hibernate或mybatis等框架时经常遇到报Transaction rolled back because it has been marked as rollback-only的异常,这个异常是怎么造成的
呢,下⾯将给⼤家进⾏详细的分析。
这是专门写的⼀个造成该异常的代码:
@Transactional
public void add(OperateLog entity)throws Exception {
// TODO Auto-generated method stub
operateLogDao.add(entity);
}
@Transactional
public void save(Member member) throws Exception {
memberDao.add(member);
}
@Transactional
public 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: sql.jdbc.MysqlDataTruncation: Data truncation: Data too long for column '_title' at row 1
sql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4072)
sql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4006)
sql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2468)
sql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2629)
sql.SQL(ConnectionImpl.java:2719)
spring roll怎么读sql.uteInternal(PreparedStatement.java:2155)
sql.uteUpdate(PreparedStatement.java:2450)
sql.uteUpdate(PreparedStatement.java:2371)
sql.uteUpdate(PreparedStatement.java:2355)
at org.apachemons.uteUpdate(DelegatingPreparedStatement.java:105)
at org.apachemons.uteUpdate(DelegatingPreparedStatement.java:105)
at org.hibernate.id.uteAndExtract(IdentityGenerat
or.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就会获取异常,并执⾏回滚。

版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。