在Laravel中使用数据库事务

不要盲目而残忍地成为,这世界恶意的一部分。

使用闭包

在Laravel中要想在数据库事务中运行一组操作,则可以在 DB facade 中使用 transaction 方法。如果在事务的闭包内抛出异常,事务将会被自动还原。如果闭包运行成功,事务将被自动提交。你不需要担心在使用 transaction 方法时还需要亲自去手动还原或提交事务:

1
2
3
4
5
DB::transaction(function () {
DB::table('users')->update(['votes' => 1]);

DB::table('posts')->delete();
});

手动创建事务

如果你想手动处理事务并对还原或提交操作进行完全控制,则可以在 DB facade 使用 beginTransaction 方法:

1
2
3
4
5
6
DB::beginTransaction(); //事务开始
if($somethingIsFailed){
DB::rollback(); //事务失败 操作回滚
return false;
}
DB::commit(); //事务成功 提交操作

注意: DB facade 的事务方法也可以用来控制 查询语句构造器 及 Eloquent ORM 的事务, 在事务中一定要定义回滚的条件, 可以用 try - catch 来捕获异常回滚, 或者是我们上面所写的这样, 根据一定的条件去判断回滚.事务的最终状态要么被提交, 要么回滚.

注意

创建表的时候一定要使用InnoDB存储引擎

1
2
3
4
5
6
7
8
public function up()
{
Schema::create('fetch_taobao_billno_task_nos', function (Blueprint $table) {
$table->engine = 'InnoDB';
$table->increments('id');
......
});
}

如何查看某一张表使用的存储引擎

1
show create table 表名;

修改某一张表的存储引擎

1
2
alter table bulk_tb_billnos engine=innodb
alter table bulk_tb_billnos engine=myisam

看你的mysql当前默认的存储引擎

1
show variables like '%storage_engine%';