栏目分类:
子分类:
返回
名师互学网用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
名师互学网 > IT > 面试经验 > 面试问答

处理ON INSERT触发器时如何锁定innodb表?

面试问答 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

处理ON INSERT触发器时如何锁定innodb表?

关于并发问题,您有一种 “简便”的 方法来防止第二种方法中的任何并发问题,在事务内部,在商品行上执行选择(

Forupdate
现在是隐式的)。同一篇文章上的任何并发插入将无法获得此相同的锁,并且将等待您。

使用新的默认隔离级别,甚至在事务中甚至不使用序列化级别,您都不会在投票表上看到任何并发插入,直到事务结束。因此,您的SUM应该保持连贯性
或看起来像连贯性
。但是,如果并发事务在同一文章上插入一个投票并在您之前提交(而第二个事务看不到您的插入),则最后一次提交的事务将覆盖计数器,您将失去1票。
因此,请使用之前的select方法对文章进行行锁定
(当然,并在事务中完成您的工作)。它很容易测试,可以在MySQL上打开2个交互式会话,并使用BEGIN开始交易。


如果使用触发器,则默认情况下您处于事务中。但是我认为您也应该在商品表上执行选择,以为运行中的并发触发器创建隐式行锁(难以测试)。

  • 不要忘记删除触发器。
  • 不要忘记更新触发器。
  • 如果您不使用触发器而留在代码中,则在进行交易之前,请小心对投票的每个插入/删除/更新查询都应在相应的文章上执行行锁定。忘记一个不是很困难。

最后一点:在开始使用交易之前,进行更困难的交易:

SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;

这样,您不需要对文章进行行锁定,MySQL将检测到同一行上可能发生的写入,并会阻塞其他事务,直到您完成操作为止。
但是,请勿使用您根据上一个请求计算出的内容
。更新查询将等待商品的锁释放,当第一个事务释放锁时

COMMIT
SUM
应该再次进行计算。因此,更新查询应包含
SUM
或进行添加。

update articles set nb_votes=(SELECT count(*) from vote) where id=2;

在这里,您会看到MySQL很聪明,如果在同时执行插入操作的同时有2个事务试图执行此操作,则会检测到死锁。在序列化级别中,我还没有找到一种使用以下方法获得错误值的方法:

   SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;   BEGIN;       insert into vote (...       update articles set nb_votes=(         SELECT count(*) from vote where article_id=xx       ) where id=XX;    COMMIT;

但是请准备好处理您必须重做的突破性交易。



转载请注明:文章转载自 www.mshxw.com
本文地址:https://www.mshxw.com/it/426008.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 MSHXW.COM

ICP备案号:晋ICP备2021003244-6号