php mysql for update_mysql并发加for update 没有锁住

我有一个长事务

在里面中后段一个行级锁

经测试,发现并没有锁住

但是单独拿出这部份,又可以锁住

在我整个长事务中,什么情况下会影响我的加锁吗?

select Id from product_term where Id=".$v['P_Term_id']." for update

回复内容:

我有一个长事务

在里面中后段一个行级锁

经测试,发现并没有锁住

但是单独拿出这部份,又可以锁住

在我整个长事务中,什么情况下会影响我的加锁吗?

select Id from product_term where Id=".$v['P_Term_id']." for update

设置会影响。

其实。。先问个小白的问题。。。是Innodb么?之前遇到个Myisam问事务的问题。。

好啦。回归正题。

排它锁正常是会锁住这个查询范围直到事务结束的。

就像你这个。会锁住对应ID行的那条记录。

不过根据事务的隔离模式。如果你没改过设置,默认是RR的。也就是你在这个排它锁之前,执行的SELECT是相同结果的。。这就会有没锁住的假象产生。。

假如你事务是这样的

BEGIN;

SELECT id FROM product_term where id<100;

UPDATE product_term SET XXX='YYY' WHERE id = 1;

...

SELECT id FROM product_term where id=1 FOR UPDATE;

...

COMMIT;

像这种,由于默认RR级,第一个范围搜已经包含了id=1的,然后同一个事务下第三个得出来的行会和第一行一样。而实际上第二行已经改过这行的数据了。如果在2个并发下,就可能造成看起来表没锁住的现象~~

排他建议在事务开始的时候做。

不知道你遇到的是不是这个问题?如果是,可以仔细研究下事务的隔离模式,你会发现还有更多的坑

f68f2add0b68e4f9810432fce46917b7.png

本文原创发布php中文网,转载请注明出处,感谢您的尊重!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值