问题描述
seata server 释放锁失败, 导致数据回滚
发生的情况
2022-07-04 11:42:02.649 INFO --- [ batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler : xid=10.42.95.207:8091:5575731897758035733,branchType=AT,resourceId=jdbc:mysql://172.22.101.156:3306/mcg-orange-order,lockKey=order_info:181086034661056547,clientIp:10.42.44.190,vgroup:mcg-orange-order-group 2022-07-04 11:42:02.659 INFO --- [ ServerHandlerThread_1_46_500] i.seata.server.coordinator.AbstractCore : Register branch successfully, xid = 10.42.95.207:8091:5575731897758035733, branchId = 5575731897758035735, resourceId = jdbc:mysql://172.22.101.156:3306/mcg-orange-order ,lockKeys = order_info:181086034661056547 2022-07-04 11:42:02.690 INFO --- [ batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler : xid=10.42.95.207:8091:5575731897758035733,branchType=AT,resourceId=jdbc:mysql://172.22.101.156:3306/mcg-orange-order,lockKey=order_item:1313176,1313177,clientIp:10.42.44.190,vgroup:mcg-orange-order-group 2022-07-04 11:42:02.700 INFO --- [ ServerHandlerThread_1_16_500] i.seata.server.coordinator.AbstractCore : Register branch successfully, xid = 10.42.95.207:8091:5575731897758035733, branchId = 5575731897758035740, resourceId = jdbc:mysql://172.22.101.156:3306/mcg-orange-order ,lockKeys = order_item:1313176,1313177 2022-07-04 11:42:03.007 INFO --- [ batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler : xid=10.42.95.207:8091:5575731897758035733,branchType=AT,resourceId=jdbc:mysql://172.22.101.156:3306/mcg-orange-goods,lockKey=stock_info:11311,11378;stock_batch:34491,463967,466026,clientIp:10.42.44.186,vgroup:mcg-orange-stock-group 2022-07-04 11:42:03.020 INFO --- [ ServerHandlerThread_1_27_500] i.seata.server.coordinator.AbstractCore : Register branch successfully, xid = 10.42.95.207:8091:5575731897758035733, branchId = 5575731897758035742, resourceId = jdbc:mysql://172.22.101.156:3306/mcg-orange-goods ,lockKeys = stock_info:11311,11378;stock_batch:34491,463967,466026 2022-07-04 11:42:03.077 INFO --- [ batchLoggerPrint_1_1] i.s.c.r.p.server.BatchLogHandler : xid=10.42.95.207:8091:5575731897758035733,extraData=null,clientIp:10.42.44.190,vgroup:mcg-orange-order-group 2022-07-04 11:42:03.286 ERROR --- [ ServerHandlerThread_1_12_500] i.seata.server.lock.AbstractLockManager : unLock globalSession error, xid:10.42.95.207:8091:5575731897758035733 branchIds:[5575731897758035735,5575731897758035740,5575731897758035742] ==> io.seata.common.exception.StoreException: Deadlock found when trying to get lock; try restarting transaction at io.seata.server.storage.db.lock.LockStoreDataBaseDAO.unLock(LockStoreDataBaseDAO.java:269) ~[seata-server-1.4.2.jar:na] at io.seata.server.storage.db.lock.DataBaseLocker.releaseLock(DataBaseLocker.java:103) ~[seata-server-1.4.2.jar:na] at io.seata.server.storage.db.lock.DataBaseLockManager.releaseGlobalSessionLock(DataBaseLockManager.java:79) ~[seata-server-1.4.2.jar:na] at io.seata.server.session.GlobalSession.clean(GlobalSession.java:230) [seata-server-1.4.2.jar:na] at io.seata.server.session.GlobalSession.closeAndClean(GlobalSession.java:243) [seata-server-1.4.2.jar:na] at io.seata.server.coordinator.DefaultCore.lambda$commit$0(DefaultCore.java:154) [seata-server-1.4.2.jar:na] at io.seata.server.storage.db.session.DataBaseSessionManager.lockAndExecute(DataBaseSessionManager.java:194) ~[seata-server-1.4.2.jar:na] at io.seata.server.session.SessionHolder.lockAndExecute(SessionHolder.java:331) ~[seata-server-1.4.2.jar:na] at io.seata.server.coordinator.DefaultCore.commit(DefaultCore.java:152) [seata-server-1.4.2.jar:na] at io.seata.server.coordinator.DefaultCoordinator.doGlobalCommit(DefaultCoordinator.java:170) ~[seata-server-1.4.2.jar:na] at io.seata.server.AbstractTCInboundHandler$2.execute(AbstractTCInboundHandler.java:95) ~[seata-server-1.4.2.jar:na] at io.seata.server.AbstractTCInboundHandler$2.execute(AbstractTCInboundHandler.java:90) ~[seata-server-1.4.2.jar:na] at io.seata.core.exception.AbstractExceptionHandler.exceptionHandleTemplate(AbstractExceptionHandler.java:124) ~[seata-core-1.4.2.jar:na] at io.seata.server.AbstractTCInboundHandler.handle(AbstractTCInboundHandler.java:90) ~[seata-server-1.4.2.jar:na] at io.seata.core.protocol.transaction.GlobalCommitRequest.handle(GlobalCommitRequest.java:34) ~[seata-core-1.4.2.jar:na] at io.seata.server.coordinator.DefaultCoordinator.onRequest(DefaultCoordinator.java:473) ~[seata-server-1.4.2.jar:na] at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.onRequestMessage(ServerOnRequestProcessor.java:124) ~[seata-core-1.4.2.jar:na] at io.seata.core.rpc.processor.server.ServerOnRequestProcessor.process(ServerOnRequestProcessor.java:77) ~[seata-core-1.4.2.jar:na] at io.seata.core.rpc.netty.AbstractNettyRemoting.lambda$processMessage$2(AbstractNettyRemoting.java:279) ~[seata-core-1.4.2.jar:na] at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149) ~[na:1.8.0_311] at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624) ~[na:1.8.0_311] at io.netty.util.concurrent.FastThreadLocalRunnable.run(FastThreadLocalRunnable.java:30) ~[netty-all-4.1.30.Final.jar:4.1.30.Final] at java.lang.Thread.run(Thread.java:748) ~[na:1.8.0_311] Caused by: com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException: Deadlock found when trying to get lock; try restarting transaction at sun.reflect.NativeConstructorAccessorImpl.newInstance0(Native Method) ~[na:1.8.0_311] at sun.reflect.NativeConstructorAccessorImpl.newInstance(NativeConstructorAccessorImpl.java:62) ~[na:1.8.0_311] at sun.reflect.DelegatingConstructorAccessorImpl.newInstance(DelegatingConstructorAccessorImpl.java:45) ~[na:1.8.0_311] at java.lang.reflect.Constructor.newInstance(Constructor.java:423) ~[na:1.8.0_311] at com.mysql.jdbc.Util.handleNewInstance(Util.java:389) ~[na:na] at com.mysql.jdbc.Util.getInstance(Util.java:372) ~[na:na] at com.mysql.jdbc.SQLError.createSQLException(SQLError.java:987) ~[na:na] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3835) ~[na:na] at com.mysql.jdbc.MysqlIO.checkErrorPacket(MysqlIO.java:3771) ~[na:na] at com.mysql.jdbc.MysqlIO.sendCommand(MysqlIO.java:2435) ~[na:na] at com.mysql.jdbc.MysqlIO.sqlQueryDirect(MysqlIO.java:2582) ~[na:na] at com.mysql.jdbc.ConnectionImpl.execSQL(ConnectionImpl.java:2535) ~[na:na] at com.mysql.jdbc.PreparedStatement.executeInternal(PreparedStatement.java:1911) ~[na:na] at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2145) ~[na:na] at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2081) ~[na:na] at com.mysql.jdbc.PreparedStatement.executeUpdate(PreparedStatement.java:2066) ~[na:na] at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeUpdate(DruidPooledPreparedStatement.java:255) ~[druid-1.1.23.jar:1.1.23] at io.seata.server.storage.db.lock.LockStoreDataBaseDAO.unLock(LockStoreDataBaseDAO.java:267) ~[seata-server-1.4.2.jar:na] ... 22 common frames omitted <==
2022-07-04 11:42:03.287 ERROR --- [ ServerHandlerThread_1_12_500] i.s.c.e.AbstractExceptionHandler : Catch TransactionException while do RPC, request: xid=10.42.95.207:8091:5575731897758035733,extraData=null ==> io.seata.core.exception.TransactionException: UnLock globalSession error, xid = 10.42.95.207:8091:5575731897758035733 at io.seata.server.session.GlobalSession.clean(GlobalSession.java:231) ~[seata-server-1.4.2.jar:na] at io.seata.server.session.GlobalSession.closeAndClean(GlobalSession.java:243) ~[seata-server-1.4.2.jar:na] at io.seata.server.coordinator.DefaultCore.lambda$commit$0(DefaultCore.java:154) ~[seata-server-1.4.2.jar:na]
期待结果
未知, 偶现
附加信息
根据提示, 是LockStoreDataBaseDAO报的错, 什么情况下会出现呢 ?
@Override public boolean unLock(String xid, List branchIds) { Connection conn = null; PreparedStatement ps = null; try { conn = lockStoreDataSource.getConnection(); conn.setAutoCommit(true); StringJoiner sj = new StringJoiner(","); branchIds.forEach(branchId -> sj.add("?")); //batch release lock by branch list String batchDeleteSQL = LockStoreSqlFactory.getLogStoreSql(dbType).getBatchDeleteLockSqlByBranchs(lockTable, sj.toString()); ps = conn.prepareStatement(batchDeleteSQL); ps.setString(1, xid); for (int i = 0; i < branchIds.size(); i++) { ps.setLong(i + 2, branchIds.get(i)); } ps.executeUpdate(); } catch (SQLException e) { throw new StoreException(e); } finally { IOUtil.close(ps, conn); } return true; }
环境信息
JDK version : 1.8.0 Seata version: 1.4.2 OS : centos 7
原提问者GitHub用户yangxiufeng666
确实存在低概率死锁问题,我们将会优化此问题,至于你说的回滚是不会发生的(低版本存在不分status直接进行timeoutrollback的情况),建议使用1.4.2及以上版本,当committing的事务报错时,会转为定时任务去继续committing
原回答者GitHub用户a364176773
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
阿里云拥有国内全面的云原生产品技术以及大规模的云原生应用实践,通过全面容器化、核心技术互联网化、应用 Serverless 化三大范式,助力制造业企业高效上云,实现系统稳定、应用敏捷智能。拥抱云原生,让创新无处不在。