seata unLock globalSession error

3zwjbxry  于 2022-12-31  发布在  其他
关注(0)|答案(3)|浏览(236)
  • 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)

  1. xxx
  2. xxx
  3. 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:
lbsnaicq

lbsnaicq1#

确实存在低概率死锁问题,我们将会优化此问题,至于你说的回滚是不会发生的(低版本存在不分status直接进行timeoutrollback的情况),建议使用1.4.2及以上版本,当committing的事务报错时,会转为定时任务去继续committing

7qhs6swi

7qhs6swi2#

确实存在低概率死锁问题,我们将会优化此问题,至于你说的回滚是不会发生的(低版本存在不分status直接进行timeoutrollback的情况),建议使用1.4.2及以上版本,当committing的事务报错时,会转为定时任务去继续committing
@a364176773
seata-server是1.4.2版本报的死锁, 客户端也是要1.4.2版本 ?

ckocjqey

ckocjqey3#

确实存在低概率死锁问题,我们将会优化此问题,至于你说的回滚是不会发生的(低版本存在不分status直接进行timeoutrollback的情况),建议使用1.4.2及以上版本,当committing的事务报错时,会转为定时任务去继续committing
@a364176773
seata-server是1.4.2版本报的死锁, 客户端也是要1.4.2版本 ?

这个改动应该是1.5生效的,server端升级到1.5.1这个死锁应该也会不再出现

相关问题