Yii2 select for update MySQL 排它锁的简单实现

新的项目需要重新构建订单入账功能,原来的系统虽然也有使用了事务,但是使用的是共享锁,为了确保数据安全性,换上排它锁。

 

Yii2 使用的ActiveRecord 提供了一个面向对象的接口,通过调用 Active Record 方法可以访问和操作存储在数据库表中的数据,省去编写原始 SQL 语句来实现对数据的增删改查。

 

翻阅了Yii2手册,并未发现有官方的ActiveRecord 接口直接调用实现for update 的效果。在百度的过程中,找到了一份在GitHub上面的YII2 ActiveRecord for update 的扩展,有兴趣了解的可以移步: https://github.com/amoydavid/yii2lockable-query 

以上通过语句 User::find()->where(['id'=>1])->forUpdate()->one(); 即可实现排它锁的效果

 

考虑到代码的维护,笔者不选择引入第三方插件,笔者根据测试,通过以下实现方式可以简单实现for update 排它锁的输出。

使用ActiveRecord 直接在where()方法中传参

$account = Account::find()
                ->select('id,money')
                ->where("id = 1 for update")    
                ->one();

 

使用findBySql构造SQL查询

      $a = Account::findBySql('select * from account where id = :id for update',['id'=>1])->all();

 

直接构造Sql查询

$account = (new \yii\db\Query())
                ->select('id,money')
                ->where('id = 1 for update')
                ->from('account')
                ->one();

以上。

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值