美文网首页
laravel 事务与锁

laravel 事务与锁

作者: 中v中 | 来源:发表于2020-01-08 10:47 被阅读0次

重构代码时,发现了一些问题,关于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)时都会取消锁。

相关文章

  • laravel 事务与锁

    结论: 首先访问了test接口后再访问testName接口,发现testName接口没有一直处在request请求...

  • laravel 事务与锁

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

  • mysql锁

    共享锁与排他锁 共享锁(读锁):其他事务可以读,但不能写。 排他锁(写锁) :其他事务不能读取,也不能写。 粒度锁...

  • 2019-03-18文章精选

    1.深入理解 MySQL ——锁、事务与并发控制 各种锁、事务与并发,写得很详细。 2.剖析分布式锁 redis部...

  • [转]SQL Server中的事务与锁

    转自SQL Server中的事务与锁 了解事务和锁 事务:保持逻辑数据一致性与可恢复性,必不可少的利器。 锁:多用...

  • 事务与锁

    事务、锁、同步的区别; 事务是数据库中的概念,包括ACID,其中I即isolation,隔离性,锁只是用来保证事务...

  • 锁与事务

    最近在写一个短链服务,提供两个API给用户使用,一个API用于生成短链,一个API用于根据短链获取长链接。 生成短...

  • 事务与锁

    多个事务的并发会出现以下几个问题: 1)脏读:事务A读取了一条记录的值,然后基于这个值做业务逻辑,在事务A提交之前...

  • 事务与锁

    样例:

  • mysql锁(十)innodb下的悲观锁和乐观锁

    ****悲观锁与乐观锁****悲观锁,也叫悲观并发控制,当事务A对某行数据应用了锁,并且当这个事务把锁释放后,其他...

网友评论

      本文标题:laravel 事务与锁

      本文链接:https://www.haomeiwen.com/subject/mwwjactx.html