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 就会对这行加锁了?