悲观锁是一种独占锁,它假设在任何时候都会有其他线程尝试访问同一数据。因此,在操作数据之前,悲观锁会将数据锁定,以确保其他线程不能访问该数据。悲观锁适用于多写的场景,比如在一个高并发的数据写入业务中。
SELECT ... FOR UPDATE;
UPDATE ...
在MySQL中,下面的示例代码演示了如何使用悲观锁。在SELECT语句之后,使用FOR UPDATE来锁定数据。在UPDATE语句之后,悲观锁会释放锁。
乐观锁是一种非独占锁,它假设在大多数情况下不会有其他线程尝试访问同一数据。因此,在操作数据之前,乐观锁并不会锁定数据,而是假设数据没有被修改,并在更新之前检查数据版本号。如果版本号一致,则将更新成功。否则,更新将被拒绝,以避免数据的冲突。乐观锁适用于多读的场景,比如在一个高并发的数据读取业务中。
SELECT ...
WHERE version = ?
UPDATE ... SET version = ? WHERE version = ?
在MySQL中,下面的示例代码演示了如何使用乐观锁。在SELECT语句之后,使用版本号来检查数据是否已被修改。在UPDATE语句之后,将版本号更新为新版本号。