glq2000 发表于 2016-05-23 16:59

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?

glq2000 发表于 2016-05-23 21:32

求明白的同学 帮忙释疑 :em16:

action08 发表于 2016-05-24 10:36

本帖最后由 action08 于 2016-05-24 10:37 编辑

看情况
正确的逻辑

select ---- lock -----(need seletc here? OR)----update -----unlock

情况2
如果表引擎有问题不支持,就直接锁表了



情况3
数据上层的业务开发,也可以承担一些责任,不要总是把事情丢给mysql

glq2000 发表于 2016-05-24 11:09

多谢,表引擎是 InnoDB,支持行锁;

所以我想了解的是在这种引擎下,即使不加 select for update 行锁,并发时的

updatenumber=number+variablewhere id=10; (id是主键索引,variable是某个确定的变量),这种情况下,mysql本身会保证number字段不出现脏数据么?

回复 3# action08


   

glq2000 发表于 2016-05-24 17:38

求释疑。。。

action08 发表于 2016-05-25 09:54

不加锁,数据库默认不能保证

glq2000 发表于 2016-05-25 10:04

回复 6# action08

多谢回复,您能帮忙贴下参考文献或者相关的官方文档么?


   

action08 发表于 2016-05-27 20:57

本帖最后由 action08 于 2016-05-27 21:11 编辑

回复 7# glq2000


    对不起,不能提供,因为我做这个完全凭兴趣和业余,
而你是在工作:em10:

glq2000 发表于 2016-05-30 16:29

求释疑~~~~~~~~~~~
页: [1]
查看完整版本: update的并发是否会产生脏数据,是否需要select for update锁?