一、锁的概念
锁机制是数据库为了保证数据的一致性,在使用共享资源时并发访问变得有序所设计的一种规则。
锁的分类
- 共享锁:多个事务对同一数据可同事加锁且互不影响,但不能修改。即共享锁不阻塞其他事务的读操作,但阻塞写操作。
- 排他锁:又称为写锁或独占锁,当前的操作没有完成前,会阻断其他操作的读取和写入。
- 表级锁:操作时,会锁定整个表。开销小,加锁快;不会出现死锁;锁定粒度大,发生锁冲突概率高,并发度最低。InnoDB、MyISAM引擎支持!
- 行级锁:操作时,会锁定当前操作行。开销大,加锁慢;会出现死锁;锁定粒度小,发生锁冲突的概率低,并发度高。InnoDB引擎默认支持!
- 页级锁:锁的粒度、发生冲突的概率和加锁的开销介于表锁和行锁之间,会出现死锁,并发性能一般。
按使用方式分类
- 悲观锁:在操作数据时比较悲观,每次去拿数据的时候认为别的线程也会同时修改数据,所以每次在拿数据的时候都会上锁,这样别的线程想拿到这个数据就会阻塞直到它拿到锁。
- 乐观锁:在操作数据时非常乐观,认为别的线程不会同时修改数据,所以不会上锁,但是在更新的时候会判断在此期间别的线程有没有更新过这个数据。
二、操作步骤
共享锁
数据可以被多个事务查询,但是不能修改
// 共享锁格式:SELECT语句 LOCK IN SHARE MODE;
// 给id为1的数据,并加入共享锁
SELECT * FROM student WHERE id=1 LOCK IN SHARE MODE;
排他锁
加锁的数据,不能被其他事务加锁查询或修改
// 排他锁格式:SELECT语句 FOR UPDATE;
// 给id为1的数据,并加入排他锁
SELECT * FROM student WHERE id=1 FOR UPDATE;
读锁与解锁
// 读锁:所有连接只能读取数据,不能修改
LOCK TABLE 表名 READ;
// 为product表加入读锁
LOCK TABLE product READ;
// 解锁(将当前会话所有的表进行解锁)
UNLOCK TABLES;
写锁
// 写锁:其他连接不能查询和修改数据
-- 为product表添加写锁
LOCK TABLE product WRITE;