thinkphp和laravel 事务/锁的使用
thinkphp
自动控制事务处理
Db::transaction(function(){ Db::table('think_user')->find(1); Db::table('think_user')->delete(1); });
Lock
方法是用于数据库的锁机制,如果在查询或者执行操作的时候使用:
Db::name('user')->where('id',1)->lock(true)->find();
就会自动在生成的SQL语句最后加上 FOR UPDATE
或者FOR UPDATE NOWAIT
(Oracle数据库)。
lock方法支持传入字符串用于一些特殊的锁定要求,例如:
Db::name('user')->where('id',1)->lock('lock in share mode')->find();
也可以手动控制事务,例如:
// 启动事务 Db::startTrans(); try{ Db::table('think_user')->find(1); Db::table('think_user')->delete(1); // 提交事务 Db::commit(); } catch (\Exception $e) { // 回滚事务 Db::rollback(); }
laravel
DB::beginTransaction(); try{ DB::commit(); //事务提交 } catch (\Exception $e){ DB::rollback();//事务回滚 }
sharedLock,lockForUpdate
- sharedLock 对应的是 LOCK IN SHARE MODE
- lockForUpdate 对应的是 FOR UPDATE
User::where('id', 33)->lockForUpdate()->get();
用于高并发请快对数据的处理和保证