首页 > 编程知识 正文

insert锁表还是锁行,锁表还能insert吗

时间:2023-05-04 10:13:48 阅读:189325 作者:3608

关于是锁定mysql行还是锁定表的问题,今天有了一点头绪。 在mysql中,innodb锁定了行,但项目发生死锁,导致表被锁定。 为什么呢? 让我们先看看这篇文章。

进行项目时,出于业务逻辑的需要,必须在数据表的一行或多行中加入行锁。 举最简单的例子,就是图书借阅系统。 假设id=1的这本书的库存为1,两个人同时来借这本书。 这里的逻辑是

发生了问题。 当两个人同时来借的时候,当第一个人可能执行了select语句的时候,第二个人插队了。 第一个人无法更新book表时,第二个人找到了数据。 其实是肮脏的数据。 第一个人将restnum值减1,因此第二个人应该将id=1的书restnum设置为0。因此,不会执行更新,并且id=1的书将被告知没有库存。 但是,数据库可能理解这一点,也不知道是否只执行一个SQL语句,即使中间插入了其他SQL语句,也会执行一个session的SQL语句,然后再执行另一个SESION。 因此,导致并发的restnum的最后结果为-1,显然这是不合理的。 因此,出现了锁定的概念,Mysql可以使用innodb引擎在索引中锁定数据行。 借书的句子如下。

这样可以等到第一个人执行commit,直到第二个人执行select语句。 这将确保第二个人不会读取第一个修改前的数据。

那个万无一失吗? 答案是否定的。 请看以下示例:

跟我一步一步来,先做表

其中,num字段被编入索引

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。