# mysql-lock **Repository Path**: lei-heng/mysql-lock ## Basic Information - **Project Name**: mysql-lock - **Description**: mysql 锁 知识点 - **Primary Language**: Unknown - **License**: Not specified - **Default Branch**: master - **Homepage**: None - **GVP Project**: No ## Statistics - **Stars**: 0 - **Forks**: 6 - **Created**: 2020-11-28 - **Last Updated**: 2020-12-19 ## Categories & Tags **Categories**: Uncategorized **Tags**: None ## README 1. DDL会自动提交事务 2. 共享锁与共享锁是兼容的,排他锁与任何锁都不兼容 3. 在非Serializable级别之下,select语句默认不加任何锁 4. update、delete、insert语句默认加排他锁 5. 默认情况下,mysql在执行一条独立的sql语句时,会自动地开启事务,以及提交事务 6. 锁会在事务结束时,释放掉 7. 可以给select语句强行加共享锁,只要在select语句之后添加上lock in share mode即可 8. 可以给select语句强行加排他锁,只要在select语句之后添加上for update即可 9. 在事务隔离级别为serializable的前提下,select语句默认就会添加共享锁 10. 表锁:lock table in share mode、lock table in exclusive mode | lock tables 表名 unlock tables 11. 行锁 12. 间隙锁,锁定一个范围。间隙锁的目的是为了防止幻读的出现 13. 在事务隔离级别为read committed的前提下,是没有间隙锁的 14. 在事务隔离级别为repeatable read的前提下 查询语句如果命中索引,则会锁住查询到的记录,同时会使用到间隙锁! 查询语句如果没有命中,则会锁住整个表! 15. 意向锁 16. 悲观锁 乐观锁 测试脚本: 测试脚本: SET autocommit=1; DROP TABLE IF EXISTS t1; CREATE TABLE t1 ( a INT PRIMARY KEY AUTO_INCREMENT, b INT, c INT, d INT, e VARCHAR(20) )CHARSET=utf8 ENGINE=INNODB; CREATE INDEX idx_b ON t1(b); INSERT INTO t1 VALUES(NULL, 2,4,3,'h'); INSERT INTO t1 VALUES(NULL, 4,4,2,'a'); INSERT INTO t1 VALUES(NULL, 7,5,1,'c'); INSERT INTO t1 VALUES(NULL, 6,4,3,'b'); INSERT INTO t1 VALUES(NULL, 4,5,7,'d'); INSERT INTO t1 VALUES(NULL, 4,4,3,'g'); INSERT INTO t1 VALUES(NULL, 3,1,3,'e'); INSERT INTO t1 VALUES(NULL, 8,2,3,'f'); INSERT INTO t1 VALUES(NULL, 4,2,3,'b'); INSERT INTO t1 VALUES(NULL, 10,2,3,'b');