文档首页/ 数据仓库服务 GaussDB(DWS)/ 故障排除/ 集群性能/ 执行SQL时报错:abort transaction due to concurrent update
更新时间:2024-07-01 GMT+08:00

执行SQL时报错:abort transaction due to concurrent update

问题现象

执行SQL时出现abort transaction due to concurrent update锁等待超时的错误。

原因分析

两个不同的事务对同一个表中的同一行数据进行并发更新/操作,导致后操作的事务发生了回滚。

举例说明:

  1. 打开一个连接Session A,使用普通用户u1连接GaussDB(DWS)数据库,在u1的同名SCHEMA u1下创建测试表u1.test,并插入数据。

    1
    2
    CREATE TABLE test (id int, name varchar(50));
    INSERT INTO test VALUES (1, 'lily');
    

  2. 打开一个新的连接会话Session B,使用系统管理员dbadmin连接GaussDB(DWS)数据库,开启事务1,执行UPDATE操作,UPDATE语句执行成功。

    1
    2
    3
    4
    START TRANSACTION;
    
    UPDATE u1.test SET id = 3 WHERE name = 'lily';
    UPDATE 1
    

  3. 在会话Session A中开启事务2,执行相同的UPDATE语句,执行报错。

    1
    2
    3
    4
    START TRANSACTION;
    
    UPDATE test SET id = 3 WHERE name = 'lily';
    ERROR:  dn_6003_6004: abort transaction due to concurrent update test 289502.
    

针对上述案例,两个不同的事务并发更新了同一条记录,而并发更新同一条记录发生冲突不会等待锁,直接报错:abort transaction due to concurrent update。

在实际业务中,并不是只有并发UPDATE同一条记录会报错,select、delete等其他SQL并发操作,也有可能报错:abort transaction due to concurrent update。

处理方法

  • 调整业务逻辑sql执行顺序

    避免update/delete长时间持有锁的sql在事务前面。

  • 避免大事务

    尽量将大事务拆分成多个小事务来处理,小事务缩短锁定资源的时间,发生冲突的几率也降低。

  • 控制并发度

    尽可能减少并发会话的数量,以减少冲突的几率。