MySQL 中提供了两种并发控制机制,悲观锁和乐观锁。其中悲观锁是指在操作数据时,认为数据会被其他并发线程修改,因此会在操作之前先加锁。而乐观锁则是在操作数据时不加锁,而是在提交操作时检查该数据是否被其他线程修改。下面我们将分别介绍一下这两种锁的使用实例。
1. 悲观锁实例
-- 创建一个测试表,包含 id 和 name 两个字段CREATE TABLE test (id INT PRIMARY KEY,name VARCHAR(50));-- 在 name 字段上加锁,并更新该字段的值BEGIN;SELECT name FROM test WHERE id = 1 FOR UPDATE;UPDATE test SET name = 'new name' WHERE id = 1;COMMIT;
在上面的实例中,我们使用了 SELECT … FOR UPDATE 语句来对 name 字段加悲观锁,保证了其他线程不能对该字段进行修改,然后再对该字段进行更新操作。
2. 乐观锁实例
-- 创建一个测试表,包含 id 和 count 两个字段CREATE TABLE test (id INT PRIMARY KEY,count INT);-- 在更新 count 字段之前,检查其是否被其他线程修改BEGIN;SELECT count FROM test WHERE id = 1;// 对 count 字段进行更新操作UPDATE test SET count = count + 1 WHERE id = 1 AND count = 当前值;COMMIT;
在上面的实例中,我们使用了 SELECT … 语句来查询 count 字段的当前值,然后再对该字段进行更新操作。但是,在更新操作之前,我们会再次查询 count 字段的当前值,如果此时该值已经被其他线程修改,则更新操作会被取消。这就是乐观锁的实现原理。