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的行,除非它们也使用了行级锁并且存在冲突。
posted @ 2024-03-18 09:40  窦戈  阅读(167)  评论(0编辑  收藏  举报