DDL会自动提交事务
共享锁与共享锁是兼容的,排他锁与任何锁都不兼容
在非Serializable级别之下,select语句默认不加任何锁
update、delete、insert语句默认加排他锁
默认情况下,mysql在执行一条独立的sql语句时,会自动地开启事务,以及提交事务
锁会在事务结束时,释放掉
可以给select语句强行加共享锁,只要在select语句之后添加上lock in share mode即可
可以给select语句强行加排他锁,只要在select语句之后添加上for update即可
在事务隔离级别为serializable的前提下,select语句默认就会添加共享锁
表锁:lock table in share mode、lock table in exclusive mode | lock tables 表名 unlock tables
行锁
间隙锁,锁定一个范围。间隙锁的目的是为了防止幻读的出现
在事务隔离级别为read committed的前提下,是没有间隙锁的
在事务隔离级别为repeatable read的前提下
查询语句如果命中索引,则会锁住查询到的记录,同时会使用到间隙锁!
查询语句如果没有命中,则会锁住整个表!
意向锁
悲观锁 乐观锁
测试脚本:
测试脚本:
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');