Mysql 事务问题
本文介绍了Mysql 事务问题的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!
问题描述
问 题
使用事务
SET AUTOCOMMIT=0; BEGIN WORK;
SELECT quantity FROM products WHERE id=3 FOR UPDATE;
UPDATE products SET quantity = '1' WHERE id=3 ;
COMMIT WORK;
不使用事务
SELECT quantity FROM products WHERE id=3 FOR UPDATE;
UPDATE products SET quantity = '1' WHERE id=3 ;
好像都是可以实现锁表的效果,避免脏读
问题:
使用for update 是否一定要开启事务?
如果都可以使用,加上事务有什么优势吗?
解决方案
-
首先,你要明白
FOR UPDATE
是什么意思,锁行使用
FOR UPDATE
必须使用事务,因为不使用事务这句话近似于没有FOR UPDATE
因为在事务中使用了
FOR UPDATE
后, 在COMMIT/ROLLBACK
之前,其他会话如果读取到这个
id=3
这行会一直等待,等待你的事务结束,并读取新的行其次
FOR UPDATE
最好用在id = xx 或 id in (xx,xx)
不然数据库会降级为锁表
你谈到的脏读的问题,你用两个
mysql -u root
做一下实验,同时请求,没有for update
的情况数据肯定是有问题的-
事务的有如下作用
将很多语句一起运行,如果中间有失败,全部都回滚
在没Commit之前,所有语句都运行在内存中。所以程序中可以根据内存中返回的计算结果决定是否回滚、提交,这样就不会伤害真正的数据库
锁表、锁行
锁行是非常强大的事务,比如锁住某商品的库存那行,这对电商极为重要。
这篇关于Mysql 事务问题的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
查看全文