update的并发是否会产生脏数据,是否需要select for update锁?
比如,表名A,字段名为 number,如下的SQL语句:语句1:update A set number=number+ 5 where id=1;
语句2:update A set number=number+ 7 where id=1;
假设这两条SQL语句同时被mysql执行,id=1的记录中number字段的原始值为 10,那么是否有可能出现这种情况:
语句1和2因为同时执行,他们得到的number的值都是10,都是在10的基础上分别加5和7,导致最终number被更新为15或17,而不是22? 求明白的同学 帮忙释疑 :em16: 本帖最后由 action08 于 2016-05-24 10:37 编辑
看情况
正确的逻辑
select ---- lock -----(need seletc here? OR)----update -----unlock
情况2
如果表引擎有问题不支持,就直接锁表了
情况3
数据上层的业务开发,也可以承担一些责任,不要总是把事情丢给mysql 多谢,表引擎是 InnoDB,支持行锁;
所以我想了解的是在这种引擎下,即使不加 select for update 行锁,并发时的
updatenumber=number+variablewhere id=10; (id是主键索引,variable是某个确定的变量),这种情况下,mysql本身会保证number字段不出现脏数据么?
回复 3# action08
求释疑。。。 不加锁,数据库默认不能保证 回复 6# action08
多谢回复,您能帮忙贴下参考文献或者相关的官方文档么?
本帖最后由 action08 于 2016-05-27 21:11 编辑
回复 7# glq2000
对不起,不能提供,因为我做这个完全凭兴趣和业余,
而你是在工作:em10: 求释疑~~~~~~~~~~~
页:
[1]