浅析My sql事务隔离级别与锁 seanlook
Transcript of 浅析My sql事务隔离级别与锁 seanlook
![Page 1: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/1.jpg)
![Page 2: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/2.jpg)
![Page 3: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/3.jpg)
会锁定多少行记录?
CREATE TABLE `t` (`f_id` int(11) AUTO_INCREMENT NOT NULL,`f_name` varchar(30) NOT NULL DEFAULT ‘’,`f_group` tinyint(3) unsigned,PRIMARY KEY (`f_id`),UNIQUE KEY `idx_name` (`f_name`)
) ENGINE=InnoDB DEFAULT CHARSET=utf8;
![Page 4: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/4.jpg)
![Page 5: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/5.jpg)
检测表锁和行锁之间的冲突为的是准备上更细粒度的锁
![Page 6: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/6.jpg)
session A session B
BEGIN WORK BEGIN WORK
select count(*)
update a record
InnoDB LockCompatity
S X IS IX
S 兼容 不兼容 兼容 不兼容
X 不兼容 不兼容 不兼容 不兼容
IS 兼容 不兼容 兼容 兼容
IX 不兼容 不兼容 兼容 兼容
![Page 7: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/7.jpg)
两段封锁法SELECT * FROM t where f_id=1SELECT * FROM t where f_id=1 FOR updateSELECT * FROM t where f_id>10 LOCK IN share modeinsert into table values (…)update table set ? where ?delete from table where ?
![Page 8: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/8.jpg)
![Page 9: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/9.jpg)
(buffer)
(LSN)
(顺序IO)
• 2 Phase Commit• innodb_flush_log_at_trx_commit
• sync_binlog
UNDO -> 原子性REDO -> 永久性Lock+Undo -> 隔离性Constraint -> 一致性
![Page 10: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/10.jpg)
![Page 11: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/11.jpg)
(MVCC)
1 a 0001 0x123456 018
f_id f_name f_age DATA_TRX_ID DATA_ROLL_PTR DELETE_BIT
undo log100
trx_1
1 aa 0002 0x234567 018
undo log101
undo log100
trx_2
![Page 12: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/12.jpg)
读未提交(Read Uncommitted)
YES YES YES
已提交读(Read Committed)
NO YES YES
可重复读(Repeatable Read)
NO NO YES ?
可串行化(Serializable)
NO NO NO
(default for RDS)
(default for Official)
隔离级别 脏读(Dirty Read)
不可重复读(Non-Repeatable Read)
幻读(Phantom Read)
![Page 13: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/13.jpg)
session A session B
1 START TRANSACTION START TRANSACTION
2 select * from t where f_id>0 and f_id<5;
3 update t set f_name='aa' where f_id=1;
4 insert into t values(3,'c');
5 select * from t where f_id>0 and f_id<5;
6 COMMIT
7 select * from t where f_id>0 and f_id<5;
8 COMMIT
9 select * from t where f_id>0 and f_id<5;
分别在RC和RR级别下执行
![Page 14: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/14.jpg)
session A session B
1 START TRANSACTION START TRANSACTION
2 select * from t where f_group>10 and f_gender=1 for update;
3 update t set f_gender=0 where f_id=99;
分别在RC和RR级别下执行
RC: 0 rows affectedRR: blocked
![Page 15: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/15.jpg)
delete from t1 where id = 10;
![Page 16: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/16.jpg)
RR session A session B
1 START TRANSACTION START TRANSACTION
2 update t set f_group=0 where f_group < 20
3 insert into t values(111,'10K',18);
4 commit
![Page 17: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/17.jpg)
![Page 18: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/18.jpg)
session A session B session C
1 START TRANSACTION START TRANSACTION START TRANSACTION
2 INSERT INTO t (f_name) VALUES (‘cc');
3 INSERT INTO t (f_name) VALUES (‘cc');
4 INSERT INTO t (f_name) VALUES (‘cc');
5 rollback
ERROR 1213 (40001): Deadlock found when trying to get lock; try restarting transaction
![Page 19: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/19.jpg)
http://dev.mysql.com/doc/refman/5.6/en/innodb-locking.html
http://tech.meituan.com/innodb-lock.html
http://mysql.taobao.org/monthly/2015/12/01/?spm=5176.100239.blogcont4270.9.cwMW19
http://hedengcheng.com/?p=771
![Page 20: 浅析My sql事务隔离级别与锁 seanlook](https://reader036.fdocuments.net/reader036/viewer/2022082213/58ed31af1a28abeb1b8b459d/html5/thumbnails/20.jpg)