mysql行级锁实例,PHP – MySQL行级锁定示例

我已经看过许多帖子,解释了Select FOR UPDATE的用法以及如何锁定行,但是我无法找到任何解释当代码尝试读取被锁定的行时发生的情况.

例如.假设我使用以下内容:

$con->autocommit(FALSE);

$ps = $con->prepare( "SELECT 1 FROM event WHERE row_id = 100 FOR UPDATE");

$ps->execute();

...

//do something if lock successful

...

$mysqli->commit();

在这种情况下,我如何确定我的锁是否成功?行已被锁定时处理场景的最佳方法是什么?

对不起,如果在某处描述,但我似乎找到的只是“快乐路径”的解释.

解决方法:

In this case, how do I determine if my lock was successful? What is the best way to handle a scenario when the row is locked already?

如果您尝试锁定的行已被锁定 – mysql服务器将不会返回此行的任何响应.它会等待,直到锁定事务被提交或回滚.

(显然:如果已经删除了行,那么SELECT将返回一个空结果集并且不会锁定任何内容)

之后,它将返回最新值,由持有锁的事务提交.

常规选择语句不关心锁定并返回当前值,忽略存在未更改的更改.

因此,换句话说:只有在锁定成功时才会执行您的代码. (其他人等待,直到先前的锁定被释放)

注意,使用FOR UPDATE也会阻止任何事务SELECTS锁定时间 – 如果你不想这样,你应该使用LOCK IN SHARE MODE.这将允许事务选择继续使用当前值,而只是阻止任何更新或删除语句.

换句话说:这就是你尝试获取锁定失败的地方.

Sidenode:这种锁定只适用于确保数据完整性. (即,在插入引用此行的内容时,不会删除任何引用的行).

一旦锁定被释放,任何被阻止(或更好地调用它被延迟)的删除语句将被执行,可能会删除您刚插入的行,因为您刚刚持有锁的行上的级联以确保完整性.

如果你想创建一个系统来避免2个用户同时修改相同的数据,你应该在应用程序级别执行此操作并查看悲观的vs乐观锁定approches,因为保持事务运行很长时间不是一个好主意.一段的时间. (我认为在PHP中,您的数据库连接无论如何都会在每次请求后自动关闭,导致对任何正在运行的事务进行隐式提交)

标签:php,mysql,mysqli,innodb,rowlocking

来源: https://codeday.me/bug/20190830/1767694.html

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

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值