# mysql-lock **Repository Path**: gapper/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**: 16 - **Forks**: 6 - **Created**: 2020-06-30 - **Last Updated**: 2024-10-26 ## 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 表名 read/write unlock tables 11. 行锁 12. 加排他锁的表锁,能够把不加锁的select语句阻塞 13. 间隙锁,锁定一个范围。间隙锁的目的是为了防止幻读的出现, 间隙锁出现在RR级别。 14. 在事务隔离级别为read committed的前提下,是没有间隙锁的 15. 如果update语句没有使用到索引,则会锁住整个表 16. 意向锁 17. 悲观锁 乐观锁 测试脚本: 测试脚本: 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');