thinkphp 锁表 lock
示例一#
//同时进行调用 bb会等待aa执行完毕之后
public function aa(){
Db::transaction(function () {
$a = OrdersModel::where(['id'=>16])->lock(true)->find()->toArray();
//等待10秒
sleep(10);
dump($a);
});
}
public function bb(){
Db::transaction(function () {
$a = OrdersModel::where(['id'=>16])->lock(true)->find()->toArray();
dump($a);
});
}
示例二#
//同时进行调用 aa等待10秒完成 bb立即执行完毕
public function aa(){
Db::transaction(function () {
$a = OrdersModel::where(['id'=>16])->lock(true)->find()->toArray();
//等待10秒
sleep(10);
dump($a);
});
}
public function bb(){
Db::transaction(function () {
$a = OrdersModel::where(['id'=>17])->lock(true)->find()->toArray();
dump($a);
});
}
行级锁是自动释放的,一旦事务完成或提交,行级锁会自动释放。具体的释放时机取决于数据库管理系统的实现方式。
通常情况下,当事务完成时,不论是通过提交(commit)还是回滚(rollback),行级锁都会被释放。提交事务会将对数据库的更改永久保存,同时释放所有相关的锁。而回滚事务会撤销对数据库的更改,同时也会释放相关的锁。
需要注意的是,在某些情况下,行级锁可能会在事务结束之前持续存在,例如在某些数据库系统中,锁可能会在事务结束时或在整个事务中的某个特定点被释放。
总之,当您的事务完成时,行级锁将会自动释放,确保其他事务可以访问和修改相应的行。
提问:查询id16行锁 id17会锁吗#
行级锁的粒度是针对单行数据的,因此在一般情况下,查询id为16的行并对其加行级锁不会影响id为17的行。
行级锁是针对被访问的行进行加锁,而不是整个表或其他行。在并发环境下,行级锁可以控制对数据行的并发访问和修改。
所以,如果你在查询id为16的行时使用了行级锁,它只会在查询期间对id为16的行加锁,而不会影响id为17的行或其他行。其他事务仍然可以访问和修改id为17的行,除非它们也使用了行级锁并且存在冲突。
作者:douyuanjun
出处:https://www.cnblogs.com/douyuanjun/p/18079681
版权:本作品采用「署名-非商业性使用-相同方式共享 4.0 国际」许可协议进行许可。
【推荐】国内首个AI IDE,深度理解中文开发场景,立即下载体验Trae
【推荐】编程新体验,更懂你的AI,立即体验豆包MarsCode编程助手
【推荐】抖音旗下AI助手豆包,你的智能百科全书,全免费不限次数
【推荐】轻量又高性能的 SSH 工具 IShell:AI 加持,快人一步
· 阿里最新开源QwQ-32B,效果媲美deepseek-r1满血版,部署成本又又又降低了!
· 开源Multi-agent AI智能体框架aevatar.ai,欢迎大家贡献代码
· Manus重磅发布:全球首款通用AI代理技术深度解析与实战指南
· 被坑几百块钱后,我竟然真的恢复了删除的微信聊天记录!
· AI技术革命,工作效率10个最佳AI工具