废话不多说,直接上代码:
service接口方法:
public ClassA executeFun(ClassC c ,ClassD d);
service接口方式实现类:
@Override
@Transactional
public ClassA executeFun(ClassC c ,ClassD d){
ClassB b = new ClassB();
保存b;
更新c;
更新d;
}
当service接口方式推动类代码执行完进行事务提交时抛出(更新c的死锁)异常:org.springframework.orm.jpa.JpaSystemException:org.hibernate.exception.LockAcquisitionException:Deadlockfoundwhentryingtogetlock;tryrestartingtransaction;nestedexceptionisjavax.persistence.PersistenceException:org.hibernate.exception.LockAcquisitionException:Deadlockfoundwhentryingtogetlock;tryrestartingtransaction
Causedby:javax.persistence.PersistenceException:org.hibernate.exception.LockAcquisitionException:Deadlockfoundwhentryingtogetlock;tryrestartingtransaction
atorg.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1387)
atorg.hibernate.ejb.AbstractEntityManagerImpl.convert(AbstractEntityManagerImpl.java:1310)
atorg.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:80)
atorg.springframework.orm.jpa.JpaTransactionManager.doCommit(JpaTransactionManager.java:512)
...52more
Causedby:org.hibernate.exception.LockAcquisitionException:Deadlockfoundwhentryingtogetlock;tryrestartingtransaction
atorg.hibernate.dialect.MySQLDialect$1.convert(MySQLDialect.java:392)
atorg.hibernate.exception.internal.StandardSQLExceptionConverter.convert(StandardSQLExceptionConverter.java:49)
atorg.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:125)
atorg.hibernate.engine.jdbc.spi.SqlExceptionHelper.convert(SqlExceptionHelper.java:110)
atorg.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:129)
atorg.hibernate.engine.jdbc.internal.proxy.AbstractProxyHandler.invoke(AbstractProxyHandler.java:81)
atcom.sun.proxy.$Proxy632.executeUpdate(UnknownSource)
atorg.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3189)
atorg.hibernate.persister.entity.AbstractEntityPersister.updateOrInsert(AbstractEntityPersister.java:3087)
atorg.hibernate.persister.entity.AbstractEntityPersister.update(AbstractEntityPersister.java:3416)
atorg.hibernate.action.internal.EntityUpdateAction.execute(EntityUpdateAction.java:140)
atorg.hibernate.engine.spi.ActionQueue.execute(ActionQueue.java:362)
atorg.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:354)
atorg.hibernate.engine.spi.ActionQueue.executeActions(ActionQueue.java:276)
atorg.hibernate.event.internal.AbstractFlushingEventListener.performExecutions(AbstractFlushingEventListener.java:326)
atorg.hibernate.event.internal.DefaultFlushEventListener.onFlush(DefaultFlushEventListener.java:52)
atorg.hibernate.internal.SessionImpl.flush(SessionImpl.java:1213)
atorg.hibernate.internal.SessionImpl.managedFlush(SessionImpl.java:402)
atorg.hibernate.engine.transaction.internal.jdbc.JdbcTransaction.beforeTransactionCommit(JdbcTransaction.java:101)
atorg.hibernate.engine.transaction.spi.AbstractTransactionImpl.commit(AbstractTransactionImpl.java:175)
atorg.hibernate.ejb.TransactionImpl.commit(TransactionImpl.java:75)
...53more
Causedby:com.mysql.jdbc.exceptions.jdb.MySQLTransactionRollbackException:Deadlockfoundwhentryingtogetlock;tryrestartingtransaction
atsun.reflect.NativeConstructorAccessorImpl.newInstance0(NativeMethod)
atsun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:39)
atsun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:27)
atjava.lang.reflect.Constructor.newInstance(Constructor.java:513)
atcom.mysql.jdbc.Util.handleNewInstance(Util.java:411)
atcom.mysql.jdbc.Util.getInstance(Util.java:386)
atcom.mysql.jdbc.SQLError.createSQLException(SQLError.java:1066)
atcom.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4187)
atcom.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:4119)
atcom.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2570)
atcom.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2731)
atcom.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2815)
atcom.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:2155)
atcom.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2458)
atcom.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2375)
atcom.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2359)
atsun.reflect.NativeMethodAccessorImpl.invoke0(NativeMethod)
atsun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:39)
atsun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:25)
atjava.lang.reflect.Method.invoke(Method.java:597)
atorg.hibernate.engine.jdbc.internal.proxy.AbstractStatementProxyHandler.continueInvocation(AbstractStatementProxyHandler.java:122)
...69more
出现的结果就是:更新对象ClassB的事务没有回滚;更新对象ClasssC的事务回滚了;更新对象ClassD的事务回滚了。
注:1、是mysqlinnodb;
2、抛出的异常(死锁异常)是运行时异常;
最后请教大家前辈:spring@Transactional注解的方式报死锁异常后个别回滚的缘由何在?有哪些解决方案?
本文来自电脑杂谈,转载请注明本文网址:
http://www.pc-fly.com/a/jisuanjixue/article-121336-1.html