数据库创建test表,我们的需求是这样的,查询test表是否存在数据,不存在,就插入1条,保证数据表只有1条数据。
我们首先尝试查询不加锁,代码如下
public function test_trans()
{
Db::startTrans(); // 启动事务
try {
$res = db('test')->find();
if (!$res) {
//执行你想进行的操作, 最后返回操作结果 result
Db::name('test')->insert(array('age'=>20));
$result = true;
if (!$result) {
db('test')->rollback();//回滚
}
}
Db::commit();
} catch (\Exception $e) {
// 回滚事务
Db::rollback();
}
}
用ab并发测试工具,请求10次,并发为5
数据库为显示5条数据,说明并发问题还存在.
我们加锁再试试
然后ab测试,结果如下,ok
结论:考虑到并发对表进行操作的时候,查询需要加锁