
# 执行SQL时报错：abort transaction due to concurrent update
#### 问题现象
执行SQL时出现abort transaction due to concurrent update锁等待超时的错误。
#### 原因分析
两个不同的事务对同一个表中的同一行数据进行并发更新/操作，导致后操作的事务发生了回滚。
举例说明：
1. 打开一个连接Session A，使用普通用户u1连接DWS数据库，在u1的同名SCHEMA u1下创建测试表u1.test，并插入数据。 
   ```
   CREATE TABLE test (id int, name varchar(50));
   INSERT INTO test VALUES (1, 'lily');
   ```
   
   
2. 打开一个新的连接会话Session B，使用系统管理员dbadmin连接DWS数据库，开启事务1，执行UPDATE操作，UPDATE语句执行成功。 
   ```
   START TRANSACTION;
   UPDATE u1.test SET id = 3 WHERE name = 'lily';
   UPDATE 1
   ```
   
   
3. 在会话Session A中开启事务2，执行相同的UPDATE语句，执行报错。 
   ```
   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在事务前面。
  

- 避免大事务 尽量将大事务拆分成多个小事务来处理，小事务缩短锁定资源的时间，发生冲突的几率也降低。
  
- 控制并发度 尽可能减少并发会话的数量，以减少冲突的几率。
  
 
