jpa transaction 回滚_spring@Transactional注解的方式报死锁异常后个别回滚的缘由何在?...

废话不多说,直接上代码:

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

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值