美文网首页
laravel 事务与锁

laravel 事务与锁

作者: nightfallLemon | 来源:发表于2017-01-13 09:40 被阅读0次

    结论:

    首先访问了test接口后再访问testName接口,发现testName接口没有一直处在request请求状态中,而是迅速的完成了。同时查看User表中id为1的数据被更改。

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

    重构代码时,发现了一些问题,关于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 事务与锁

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