innodb锁(一)

INNODB的几种锁

共享锁(S-LOCKING),允许一个事务去读一行,阻止其它事务获得相同数据集的排它锁

排它锁(X-LOCKING),允许获得排它锁的事务更新数据,阻止其它事务取得相同数据集的共享读锁和排它锁

INNODB还独有实现了2种锁

意向共享锁(IS),事务打算给数据行加共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁

意向独占锁(IX),事务打算给数据行加排它锁,事务在给一个数据行加排它锁前必须先取得该表的IX锁

Innodb 行级别的锁基于索引实现的  支持并发和一致性

注意:

1)  在不通过索引条件查询的时候,innodb使用的是表锁(默认地,全表所有行加锁,和表级别锁相当,例外条件是RC+innodb_locks_unsafe_for_binlog组合选项)而不是细粒度行锁

2)  由于MYSQL的行锁针对索引加锁,不是针对记录加的锁,所以虽然时访问不同行的记录,但是如果是使用相同的索引键,则会出现锁冲突

加共享锁:select * from xx where ,….. lock in share mode

加排它锁:select * from xx where ….. for update,update delete 也是加排它锁

 

X

IX

S

IS

X

冲突

冲突

冲突

冲突

IX

冲突

兼容

冲突

兼容

S

冲突

冲突

兼容

兼容

IS

冲突

兼容

兼容

兼容

在5.1以前,只能通过showfull processlist,show engineinnodb status等命令查看锁状态

5.1以后能从视图查看锁 事务状态 information_schma 库下面

Innodb_trx  innodb_locks innodb_lock_waits

看下innodb_trx表中常用的字段

Trx_id:innodb存储引擎内部唯一事务ID

Trx_state:当前事务的状态

Trx_started:事务开始时间

Trx_wait_started:事务开始等待时间

Trx_mysql_thread_id MYSQL中的线程ID show processlist 显示结果

Trx_query:事务运行的SQL语句


看下innodb_locks表中,几个最常用的字段:

Lock_id:锁的ID

Lock_trx_id:事务ID

LOCK_MODE:锁的模式

LOCK_TYPE:所得类型表锁还是行锁

LOCK_TABLE:要加锁的表

LOCK_INDEX:锁的索引

LOCK_SPACE:innodb存储引擎表空间ID号

LOCK_PAGE:被锁住的页的数量,若是表锁,则该值为null

LOCK_REC:被锁住行的数量,若是表锁则该值为NULL

LOCK_DATA:被锁住的行的主键值,若是表锁时,则该值为NULL;

通过select* from information_schema.INNODB_LOCK可查看


innodb_lock_waits最常用的几个字段

Requesting_trx_id:申请资源的事务ID

Request_lock_id:申请锁的ID

Blocking_trx_id:阻塞锁的ID

哪个事务被哪个事务阻塞很明显通过该innodb_lock_waits看


一致性非锁定在MVCC读取当前数据库里面的数据在读取的数据正在被修改不会产生锁等待(对当前数据拍照片)读没有加锁 没有加共享锁 没有被阻塞

访问不同的记录不会发生等待 由于MySQL的行锁是针对索引加的锁,不是针对记录加的锁,所以虽然时访问不同的行记录。但是如果是使用相同的索引键,会出现锁冲突的,应用设计的时候要注意

待续...




评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值