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” 是否一定要开启事务?
如果都可以使用,加上事务有什么优势吗?
问题解答
回答1:首先,你要明白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之前,所有语句都运行在内存中。所以程序中可以根据内存中返回的计算结果决定是否回滚、提交,这样就不会伤害真正的数据库
锁表、锁行
锁行是非常强大的事务,比如锁住某商品的库存那行,这对电商极为重要。
回答2:加上事务,可以避免幻读
相关文章:
1. python round 四舍五入?2. sql语句 - 如何在mysql中批量添加用户?3. javascript - 按钮链接到另一个网址 怎么通过百度统计计算按钮的点击数量4. 事务 - mysql共享锁lock in share mode的实际使用场景5. mysql - PHP定时通知、按时发布怎么做?6. mysql - 数据库建字段,默认值空和empty string有什么区别 1107. 怎么php怎么通过数组显示sql查询结果呢,查询结果有多条,如图。8. node.js - mysql如何通过knex查询今天和七天内的汇总数据9. mysql - JAVA怎么实现一个DAO同时实现查询两个实体类的结果集10. python - 请问这两个地方是为什么呢?
