laravel 事务与锁

  • 重构代码时,发现了一些问题,关于laravel锁与事务之间的问题,主要有下面列出的几个问题.

    • 事务的代码如何书写。

    • 开启事务,在事务中处理数据时,是否对数据加锁。

    • 开启事务,对事务中数据进行加锁,其他数据是否可以访问。

    • 开启事务,对事务中数据进行加锁,何时锁才会取消。

接下来我们就测试一下

事务的代码如何书写。

  • 查阅了一些资料,比较普遍的写法便是。

      // 开启事务
          DB::beginTransaction();
          try {
              // 需要处理的逻辑
              // doSomething;
              // 提交事务
              DB::commit();
          } catch (Exception $e) {
              // 数据回滚, 当try中的语句抛出异常。
              DB::rollBack();
              // 执行一些提醒操作等等...
          }

开启事务,在事务处理事务时,是否对数据加锁。

  • 首先这是接口test,在接口中声明了一个死循环,即事务不会提交.(因为只是测试所以代码写的并不是很规范)

      public function test()
      {
          DB::beginTransaction();
          $user = new User();
          $u = $user->where('id', '=', '1')->first();
          $u->is_admin = 0;
          $u->save();
          while(1){
              sleep(1);
          }
          DB::commit();
      }
  • 接口testName

      public function testName()
      {
          $user = new User();
          $u = $user->find(1);
          $u->is_admin  = 2;
          $u->save();
      }
    测试结果
  • 当我在先访问test接口后,再访问tesName接口,User表中的id为1的数据的is_admim被修改。意味着,只是单纯的开启一个事务,并不会对事务中的数据进行加锁,只会保证数据的完整性。

开启事务,对事务中数据进行加锁,其他数据是否可以访问。

  • 接口test

    • 在接口中查询数据的时候使用了sharedLoack()方法,即悲观锁。

    • 同时写了一个死循环,使事务无法提交。

      public function test()
      {
        DB::beginTransaction();
        $user = new User();
        $u = $user->where('id', '=', '1')->sharedLock()->first();
        $u->is_admin = 0;
        $u->save();
        while(1){
            sleep(1);
        }
        DB::rollBack();
      }
  • 接口testName

      public function testName()
      {
          $user = new User();
          $u = $user->find(1);
          $u->is_admin  = 2;
          $u->save();
      }
    测试结果
  • 当我访问test接口后,在访问testName。很明显,因为test接口把User表中id为1的数据锁住,所以testName接口一直处在request中,无法完成。

  • 并且当我把2个接口都取消访问后, 在调用testName, 也一直处于request中,说明第一次访问test接口的锁依旧在,并没有因为接口的关闭而关闭。 等了一段时间估计mysql的锁超时没有提交,被回滚了。。对mysql也不是很熟悉,见谅。

  • User表id为1的数据也没有修改

开启事务,对事务中数据进行加锁,何时锁才会取消。

  • 接口test

    • 同时单独测试了rollBack,commit;

      public function test()
      {
        DB::beginTransaction();
        $user = new User();
        $u = $user->where('id', '=', '1')->sharedLock()->first();
        $u->is_admin = 0;
        $u->save();
        DB::rollBack();
        // DB::commit();
      }
  • 接口testName

      public function testName()
      {
          $user = new User();
          $u = $user->find(1);
          $u->is_admin  = 2;
          $u->save();
      }
结果
  • 首先访问了test接口后再访问testName接口,发现testName接口没有一直处在request请求状态中,而是迅速的完成了。同时查看User表中id为1的数据被更改。

  • 在事务中对数据进行加锁,当事务进行提交(commit)或者回滚(rollBack)时都会取消锁。


评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值