首页 » Mysql » 正文

Oracle和Mysql的锁总结

Oracle

按照锁的相容性可将锁分为两类,分别是:

1. X-排他锁:如果对象被一个排他锁给琐住,其他会话就不能够在对这个会话所加锁的对象加任何的锁。
2. S-共享锁:如果对象被一个共享锁给锁住,其他会话除了S锁本身,都不能对这个会话所加锁的对象加任何的锁。

按照锁的粒度,锁类型可以分为三大类:

1.DML Lock:目的是为了保护数据完整性。
2.DDL Lock:目的是为了保护数据库对象的结构。
3.一些内部锁和latch:目的是为了保护数据库的内部结构。

DML锁按照范围分为:

1.TX(row level lock)行级锁

行级锁只有X排他锁,或者没被锁两种情况。

2.TM(table level lock)

1. 共享锁(Share Table Lock,S)
2. 排它锁(Exclusive Table Lock,X)
3. 行级共享锁(Row Share Table Lock,RS)
4. 行级排它锁(Row Exclusive Table Lock,RX)
5. 共享行级排它锁(Share Row Exclusive Table Lock,SRX)

表级锁的互斥关系:

   T2/T1 S X RS RX SRX -
S Y N Y N N Y
X N N N N N Y
RS Y N Y Y Y Y
RX N N Y Y N Y
SRX N N Y N N Y
- Y Y Y Y Y Y

 
锁和SQL语句的对应关系:

SQL语句 表锁模式 允许的锁模式
Select * from table_name…… RS、RX、S、SRX、X
Insert into table_name…… RX RS、RX
Update table_name…… RX RS、RX
Delete from table_name…… RX RS、RX
Select * from table_name for update RS RS、RX、S、SRX
lock table table_name in row share mode RS RS、RX、S、SRX
lock table table_name in row exclusive mode RX RS、RX
lock table table_name in share mode S RS、S
lock table table_name in share row exclusive mode SRX RS
lock table table_name in exclusive mode X

 
Mysql

1. 全局读锁(global read lock)- FLUSH TABLES WITH READ LOCK

2. Myisam仅仅支持表锁。

3. Innodb支持行级锁,锁的兼容关系如下:

 

兼容 X IX S IS
X 冲突 冲突 冲突 冲突
IX 冲突 兼容 冲突 兼容
S 冲突 冲突 兼容 兼容
IS 冲突 兼容 兼容 兼容