select for update 并发insert死锁问题

Posted

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了select for update 并发insert死锁问题相关的知识,希望对你有一定的参考价值。

参考技术A

问题描述:

检查程序运行日志的时候, 发现了很多DB死锁, 我这边程序中使用的是悲观锁, 因为考虑到不想让调用端重试。

死锁原因:

有多个请求同时希望insert表, 程序中逻辑如下:

select for update where uid = ?

if [obj ]not exist

insert

else

update

死锁原因就是 select for update 如果记录不存在mysql会先加一个意向锁, 当多个请求(多个线程) 同时加了意向锁之后(意向锁之间可兼容), 第一个线程尝试insert的时候会尝试加排他锁, 这时排他锁会被第二个线程的pending住, 此时第二个线程尝试插入的时候, 也会尝试加排他锁, 这个时候就会出现deadlock的情况

锁兼容矩阵

方案如下几种选择:

035 控制并发 select * from test1 where id =1 for update 就会对这行加锁了?

  今天在看同事程序的时候,看到这种用法,顺便学习下。

一:

1.

  这个文章挺好的,先粘贴链接,有空来实验,写一个完整的文档。

  URL:http://www.itpub.net/thread-1918165-1-1.html

 

2.

  https://www.cnblogs.com/wxgblogs/p/6849064.html

以上是关于select for update 并发insert死锁问题的主要内容,如果未能解决你的问题,请参考以下文章

为啥 SELECT FOR UPDATE SKIP LOCKED 时 PostgreSQL 会抛出并发更新错误?

Attribute "resultType" must be declared for element type "update" or "inser

Mysql加锁过程详解-select for update/lock in share mode 对事务并发性影响

035 控制并发 select * from test1 where id =1 for update 就会对这行加锁了?

select..for update

由SELECT ... FROM ... FOR UPDATE想到的