thinkphp lock 锁 的使用和例子
程序员文章站
2024-01-13 15:26:52
...
在开发需求中会遇到这样一种情况,并发请求。数据库的更新还没执行结束,另一个select查出的数据,会是更新之前的数据,那就会造成查询数据不准确。
那怎么解决呢?用innoDB的事务和锁就能解决这个问题。在我们当前行更新还没结束的时候,select查询此行的数据会被锁起来。
比如我们数据库有这样两行数据
我们把id=1的num数据更新为1000,sleep10秒,这时候我们select id=1的数据时,会等待update的更新结束,如果我们select id=2的时候,不需要等待10秒,会立马获取到数据。
这就是InnoDB的行锁,只会锁当前update的那行数据,不会锁整表。
下面会列出测试代码,记得吧引擎改为innoDB,不是MYISAM。
class Index extends Controller
{
public function index()
{
$model=Db::name('test');
$model->startTrans();
try{
$list=$model->lock(true)->find();
$model->where(['id'=>1])->data(['num'=>900])->update();//id为1的更新
sleep(10);//等待10秒
$model->commit();
print_r($list);
}catch (\Exception $exception){
$model->rollback();
throw $exception;
}
}
public function index2(){
$model=Db::name('test');
$model->startTrans();
try{
$list=$model->lock(true)->where(['id'=>1])->find();//id为1在更新时,select id=1 会等待。把ID改为2时,不等待
$model->commit();
print_r($list);
}catch (\Exception $exception){
$model->rollback();
throw $exception;
}
}
}
测试步骤:请求index后,在请求index2,就会看到index2会等index加载结束,我们才能看到index2的打印结果。如果index2的id改为2后,则不会受到index的影响
上一篇: Oracle查看被锁的表和解锁
推荐阅读
-
thinkphp lock 锁 的使用和例子
-
使用thinkphp和php中的问题-preg_replace, 链式查询
-
Lock锁的使用
-
Oracle PGA和SGA区别以及latch和lock的使用场合
-
java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
-
java并发编程(十三)- 显示锁使用Lock和Condition实现等待通知模式
-
java 线程 Lock 锁使用Condition实现线程的等待(await)与通知(signal)
-
php中使用换行及(n或rn和br)的例子
-
ThinkPHP的cookie和session冲突造成Cookie不能使用的解决方法
-
PHP实现的交通银行网银在线支付接口ECSHOP插件和使用例子