乐观锁
先获取数据,再进行更改,期间如果数据被其他用户进行了修改,则乐观锁会自动返回错误或者抛出异常,提示数据已经过期,此时需要重新获取数据,再进行更改。
乐观锁的示例代码如下:
$version = $db->query('select version from demo where id=1'); $db->query('update demo set version='.$version.'+1 where id=1 and version='.$version);
悲观锁
悲观锁则是在读取数据时先获取锁,期间其他用户暂时无法修改该数据。当读取完数据后,需要立刻释放锁,这样其他用户就可以进行操作。
悲观锁的示例代码如下:
$db->begin_transaction(); $db->query('select * from demo where id=1 for update'); //do something $db->commit();
总之,乐观锁和悲观锁是各有特点的,需在具体业务场景下认真选择使用。在并发量比较大的情况下,悲观锁会对系统造成较大的性能损失,因为每次操作都需要加锁和解锁。而乐观锁则更侧重于数据的完整性,且由于没有锁的开销所以性能较高。因此,根据业务场景和实际需求来选择应当使用乐观锁还是悲观锁。