mysql事务锁表注意事项

**

事务锁表:

**

执行一:

begin;

update ieo_statistics set project_id = 0 where id = 1;

update ieo_statistics set project_id = 0 where id = 2;

执行二:
begin;

update ieo_statistics set project_id = 0 where id = 2;

update ieo_statistics set project_id = 0 where id = 1;

COMMIT;

//这样执行二会进入等待,执行一提交后执行二才会执行成功
//前提:需要操作的是同一行
//查询不受任何影响,针对的是修改和删除,新增的话一般很难受影响
//判断条件是索引的话只会锁行,如果不是则会锁表。

**

死锁操作:

**

一区:

第一步执行:

begin;

update ieo_statistics set project_id = 0 where id = 1;

第三部执行
update ieo_statistics set project_id = 0 where id = 2;

二区:

第二步执行
begin;

update ieo_statistics set project_id = 0 where id = 2;

第四步执行
update ieo_statistics set project_id = 0 where id = 1;

//这边造成了死锁操作,一般后端到了第四步执行默认会报错进行回滚。
//执行一 成功
//执行二 成功
//执行三 此操作一出,代表整个二区都要进入等待,需要等二区执行commit完才能执行(不关commit前后顺序的关系)。
//执行四 死锁出现,因为锁行,他也需要整个一区进入等待,那么互相等待直接变成死锁,执行四的时候会直接抛出错误,然后回滚。

你可能感兴趣的:(mysql)