1 悲观锁
1.1 原理
在select的时候就会加锁,采用先加锁后处理的模式,虽然保证了数据处理的安全性,但也会阻塞其他线程的写操作。在读取数据时锁住那几行,其他对这几行的更新需要等到悲观锁结束时才能继续 。select ... for update
悲观锁适用于写多读少的场景,因为拿不到锁的线程,会将线程挂起,交出CPU资源,可以把CPU给其他线程使用,提高了CPU的利用率。
1.2 操作步骤
- 维护一张独立的锁表lock_table,新建lock_name字段并添加普通索引
- 提前在表中插入lock_name = xxx的记录
- 加锁时通过select * from lock_table where lock_name = xxx for update上行锁(lock_name添加普通索引就是为了避免锁范围过大,没有索引时for update加的是表锁)
- 事务提交后释放锁
使用sql语句: select ... for update 给具体的行数据加上排他锁(product_code加上