Mysql 事务问题
阿神
阿神 2017-04-17 16:06:10
[MySQL讨论组]
  1. 使用事务

SET AUTOCOMMIT=0; BEGIN WORK; 
SELECT quantity FROM products WHERE id=3 FOR UPDATE;
UPDATE products SET quantity = '1' WHERE id=3 ; 
COMMIT WORK;
  1. 不使用事务

SELECT quantity FROM products WHERE id=3 FOR UPDATE;
UPDATE products SET quantity = '1' WHERE id=3 ; 

好像都是可以实现锁表的效果,避免脏读

问题:

  1. 使用“for update” 是否一定要开启事务?

  2. 如果都可以使用,加上事务有什么优势吗?

阿神
阿神

闭关修行中......

全部回复(2)
高洛峰
  1. 首先,你要明白FOR UPDATE是什么意思,锁行

    • 使用 FOR UPDATE 必须使用事务,因为不使用事务这句话近似于没有FOR UPDATE

    • 因为在事务中使用了 FOR UPDATE后, 在COMMIT/ROLLBACK之前,

    • 其他会话如果读取到这个id=3这行会一直等待,等待你的事务结束,并读取新的行

    • 其次 FOR UPDATE 最好用在 id = xx 或 id in (xx,xx) 不然数据库会降级为锁表

  2. 你谈到的脏读的问题,你用两个mysql -u root做一下实验,同时请求,没有for update的情况数据肯定是有问题的

  3. 事务的有如下作用

    • 将很多语句一起运行,如果中间有失败,全部都回滚

    • 在没Commit之前,所有语句都运行在内存中。所以程序中可以根据内存中返回的计算结果决定是否回滚、提交,这样就不会伤害真正的数据库

    • 锁表、锁行

    • 锁行是非常强大的事务,比如锁住某商品的库存那行,这对电商极为重要。

PHPz

加上事务,可以避免幻读

热门教程
更多>
最新下载
更多>
网站特效
网站源码
网站素材
前端模板
关于我们 免责申明 意见反馈 讲师合作 广告合作 最新更新 English
php中文网:公益在线php培训,帮助PHP学习者快速成长!
关注服务号 技术交流群
PHP中文网订阅号
每天精选资源文章推送
PHP中文网APP
随时随地碎片化学习
PHP中文网抖音号
发现有趣的

Copyright 2014-2025 https://www.php.cn/ All Rights Reserved | php.cn | 湘ICP备2023035733号