- I have searched the issues of this repository and believe that this is not a duplicate.
Ⅰ. Issue Description
seata server 释放锁失败, 导致数据回滚
Ⅱ. Describe what happened
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]
Ⅲ. Describe what you expected to happen
未知, 偶现
Ⅳ. How to reproduce it (as minimally and precisely as possible)
- xxx
- xxx
- xxx
Ⅴ. Anything else we need to know?
根据提示, 是LockStoreDataBaseDAO报的错, 什么情况下会出现呢 ?
@Override
public boolean unLock(String xid, List<Long> 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;
}
Ⅵ. Environment:
- JDK version : 1.8.0
- Seata version: 1.4.2
- OS : centos 7
- Others:
3条答案
按热度按时间lbsnaicq1#
确实存在低概率死锁问题,我们将会优化此问题,至于你说的回滚是不会发生的(低版本存在不分status直接进行timeoutrollback的情况),建议使用1.4.2及以上版本,当committing的事务报错时,会转为定时任务去继续committing
7qhs6swi2#
确实存在低概率死锁问题,我们将会优化此问题,至于你说的回滚是不会发生的(低版本存在不分status直接进行timeoutrollback的情况),建议使用1.4.2及以上版本,当committing的事务报错时,会转为定时任务去继续committing
@a364176773
seata-server是1.4.2版本报的死锁, 客户端也是要1.4.2版本 ?
ckocjqey3#
确实存在低概率死锁问题,我们将会优化此问题,至于你说的回滚是不会发生的(低版本存在不分status直接进行timeoutrollback的情况),建议使用1.4.2及以上版本,当committing的事务报错时,会转为定时任务去继续committing
@a364176773
seata-server是1.4.2版本报的死锁, 客户端也是要1.4.2版本 ?
这个改动应该是1.5生效的,server端升级到1.5.1这个死锁应该也会不再出现