小编给大家分享一下MySQL中使用如果不存在需要注意什么,希望大家阅读完这篇文章之后都有所收获、下面让我们一起去探讨吧!
环境MySQL 5.6.14
事务隔离级别读提交
事务的开启和结束由JAVA程序控制。
上次报死锁的过程,抽象如下
- <李>
delimitr $ $
李> <李>创建过程“test_proc”(
,,,pid int
)
开始
,,,如果不存在(select *从t id=pid)然后
,,,,,,,插入t (id)值(pid);
,,,如果,
,,,
,,,更新t组总=总+ 1 id=pid;
结束$ $
分隔符,,
李>
死锁原因已经明白了,就是并发情况下,插入遇到排它锁,则尝试加共享锁。
在最后更新的时候,两个持有共享锁的连接,都尝试申请排它锁,则导致了死锁。
但是问题是…怎么会走到了最后一行的更新语句?
另外两个连接,不是应该在插入语句时报,重复的条目& # 39;xx # 39;关键& # 39;主要# 39;错误吗?
问题应该出在这种结构里
如果不存在(select *从t id=pid)然后
,,xxx
结束如果;
使用如果不存在模式,真心要注意啊。在这种结构里出现的异常,不会报的错,而是直接跳出如果判断,继续执行! !
实验准备
- <李>
创建表“t”(
“id”才能int(11)不是NULL,
“总”才能int (11) NOT NULL默认& # 39;0 & # 39;
主键才能(id)
)引擎=InnoDB默认字符集=utf8mb4;
截断表t;
下降过程中如果存在test_proc;
分隔符$ $
创建过程“test_proc”(
,,,pid int,
,,,是int
)
开始
,,,如果不存在(select *从t id=pid)然后
,,,,,,,插入t (id、总)值(pid是);
,,,,,,,更新t组总=是+ 1,id=pid;
,,,如果,
,,,选择是+ 1,,,,,
结束$ $
李分隔符;
>
打开三个客户端,分别执行过程
看完了这篇文章,相信你对“MySQL中使用如果不存在需要注意什么”有了一定的了解,如果想了解更多相关知识,欢迎关注行业资讯频道,感谢各位的阅读!