Laravel框架的事务处理

数据库事务

想要在一个数据库事务中运行一连串操作,可以使用 DB 门面的 transaction 方法,使用 transaction 方法时不需要手动回滚或提交:如果事务闭包中抛出异常,事务将会自动回滚;如果闭包执行成功,事务将会自动提交:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);
    DB::table('posts')->delete();
});

处理死锁

数据库死锁指的是有两个或两个以上数据库操作相互依赖,一方需要等待另一方退出才能获取资源,但是没有一方提前退出,就会造成死锁,数据库事务容易造成的一个副作用就是死锁。为此 transaction 方法接收一个可选参数作为第二个参数,用于定义死锁发生时事务的最大重试次数。如果尝试次数超出指定值,会抛出异常:

DB::transaction(function () {
    DB::table('users')->update(['votes' => 1]);    
    DB::table('posts')->delete();
}, 5);

手动使用事务

如果你想要手动开启事务从而对回滚和提交有更好的控制,可以使用 DB 门面的 beginTransaction 方法:

DB::beginTransaction();

你可以通过 rollBack 方法回滚事务:

DB::rollBack();

最后,你可以通过 commit 方法提交事务:

DB::commit();

手动使用事物实例

DB::beginTransaction();
try{
    $name = 'abc';
    $result1 = Test::create(['name'=>$name]);
    if (!$result1) {
        /**
         * Exception类接收的参数
         * $message = "", $code = 0, Exception $previous = null
         */
        throw new \Exception("1");
    }
    $result2 = Test::create(['name'=>$name]);
    if (!$result2) {
        throw new \Exception("2");
    }
    DB::commit();
} catch (\Exception $e){
    DB::rollback();//事务回滚
    echo $e->getMessage();
    echo $e->getCode();
}

注意:如果id是自增的话,mysql的primary key是在内存中维护的,事务回滚是不会回退id,所以中间会出现断层

猜你喜欢

转载自blog.csdn.net/weixin_44156901/article/details/86431312