20

浅析My sql事务隔离级别与锁 seanlook

  • Upload
    -

  • View
    205

  • Download
    5

Embed Size (px)

Citation preview

Page 1: 浅析My sql事务隔离级别与锁 seanlook
Page 2: 浅析My sql事务隔离级别与锁 seanlook
Page 3: 浅析My sql事务隔离级别与锁 seanlook

会锁定多少行记录?

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
Page 5: 浅析My sql事务隔离级别与锁 seanlook

检测表锁和行锁之间的冲突为的是准备上更细粒度的锁

Page 6: 浅析My sql事务隔离级别与锁 seanlook

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

两段封锁法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
Page 9: 浅析My sql事务隔离级别与锁 seanlook

(buffer)

(LSN)

(顺序IO)

• 2 Phase Commit• innodb_flush_log_at_trx_commit

• sync_binlog

UNDO -> 原子性REDO -> 永久性Lock+Undo -> 隔离性Constraint -> 一致性

Page 10: 浅析My sql事务隔离级别与锁 seanlook
Page 11: 浅析My sql事务隔离级别与锁 seanlook

(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

读未提交(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

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

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

delete from t1 where id = 10;

Page 16: 浅析My sql事务隔离级别与锁 seanlook

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
Page 18: 浅析My sql事务隔离级别与锁 seanlook

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

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