其实也不算坑,只是在官方文档中未提及或开发过程中本人未注意到的点
1.多数据库使用事务的坑(model指定了$connection,用的是/config/database.php里的连接)
使用DB::beginTransaction()是没有效果的,相当于未使用事务,必须指定连接,事务才能生效
DB::connection('连接名')->beginTransaction();
DB::connection('连接名')->rollback();
DB::connection('连接名')->commit();
2.主从分离中事务的坑
在事务开始直到结束这一过程中,所有的查询更新删除操作都作用在主库,所以不必担心在事务中的查询会查询到从库,也没必要在事务中为了查询主库而使用onWriteConnection;
未使用事务的地方,想要读主库的数据,可以使用onWriteConnection: Table::onWriteConnection()->find($id);
3.increment与decrement的坑
$rs1 = Order::find(41)->decrement('shipping_fee', 0);
echo '$rs1 = '.$rs1.' ';
$rs2 = Order::find(41)->decrement('order_amount', 0);
echo '$rs2 = '.$rs2.' ';
运行结果:$rs1 = 1 $rs2 = 0
原因分析:查看这两行代码执行的真实sql语句:
update orders
set shipping_fee
= shipping_fee
- 0, updated_at
= '2017-08-03 10:10:25' where id
= '41'
update orders
set order_amount
= order_amount
- 0, updated_at
= '2017-08-03 10:10:25' where id
= '41'
结论:因为使用了laravel时间自动更新的功能,而且更新的是同一条数据,updated_at为最新时间,第一条语句执行返回条数1,而第二条的updated_at跟第一条一样,返回的更新条数就为0了。
网友评论