MySql Innodb存储引擎--锁和事务

 

 

lock和latch的比较

latch 一般称为闩锁(轻量级的锁) 因为其要求锁定的时间非常短,若迟勋时间长,则应用性能非常差,在InnoDB存储引擎中,latch有可以分为mutex(互斥锁)和rwlock(读写锁)其目的用来保证并发线程操作临界资源的正确性,并且没有死锁检测的机制

 

lock的对象是事务,用来锁定的是数据库中的UI想,如表、页、行。并且一般lock对象仅在事务commit或rollback后进行释放(不同事务隔离级别释放的时间可能不同),此外lock正如大多数数据库中一样,是有死锁机制的。表显示了lock与latch的不同


 

mysql> SHOW ENGINE INNODB MUTEX;
+--------+-------------------+-------------+
| Type   | Name              | Status      |
+--------+-------------------+-------------+
| InnoDB | dict0dict.cc:1057 | os_waits=2  |
| InnoDB | log0log.cc:844    | os_waits=1  |
| InnoDB | fil0fil.cc:1690   | os_waits=1  |
| InnoDB | dict0dict.cc:1066 | os_waits=3  |
| InnoDB | log0log.cc:907    | os_waits=11 |
+--------+-------------------+-------------+

在DEBUG版本下,通过SHOW ENGINE INNODB MUTEX 可以看到latch的更多信息


debug中status字段中的参数介绍


 

若将上锁的对象看成一棵树,那么对最上层的对象上锁,也就是对最细粒度的对象进行上锁,那么首先需要对粗粒度的对象上锁,如上图,如果需要对页上的记录r进行上X锁,那么分别需要对数据A、表、页上意向锁IX,最后对记录r上X锁,若其中任何一部分导致等待,那么该操作需要等待粗粒度锁的完成


 

 

 

 

 

innodb锁相关的表

INNODB_LOCKS表

a)        lock_id:锁的id以及被锁住的空间id编号、页数量、行数量

b)        lock_trx_id:锁的事务id。

c)        lock_mode:锁的模式。

d)        lock_type:锁的类型,表锁还是行锁

e)        lock_table:要加锁的表。

f)          lock_index:锁的索引。

g)        lock_space:innodb存储引擎表空间的id号码

h)        lock_page:被锁住的页的数量,如果是表锁,则为null值。

i)          lock_rec:被锁住的行的数量,如果表锁,则为null值。

j)          lock_data:被锁住的行的主键值,如果表锁,则为null值。

 

innodb_lock_waits表

1)        requesting_trx_id:申请锁资源的事务id。

2)        requested_lock_id:申请的锁的id。

3)        blocking_trx_id:阻塞的事务id。

4)        blocking_lock_id:阻塞的锁的id。

 

innodb_trx表

trx_id事务ID

trx_state事务状态

trx_started事务开始时间

trx_requested_lock_idinnodb_locks.lock_id

trx_wait_started事务开始等待的时间

trx_weight

trx_mysql_thread_id事务线程ID

trx_query具体SQL语句

trx_operation_state事务当前操作状态

trx_tables_in_use事务中有多少个表被使用

trx_tables_locked事务拥有多少个锁

trx_lock_structs

trx_lock_memory_bytes事务锁住的内存大小(B)

trx_rows_locked事务锁住的行数

trx_rows_modified事务更改的行数

trx_concurrency_tickets事务并发票数

trx_isolation_level事务隔离级别

trx_unique_checks是否唯一性检查

trx_foreign_key_checks是否外键检查

trx_last_foreign_key_error最后的外键错误

trx_adaptive_hash_latched

trx_adaptive_hash_timeout

 

 

 

 

 

一致性非锁定读(consistent nonlocking read)是指InnoDB存储引擎通过多版本控制(multi versionning)的方式来读取当前执行时间数据库中行的数据,如果读取的行正在执行DELETE或UPDATE操作,这是读取操作不会因此等待行上锁的释放。相反的,InnoDB会去读取行的一个快照数据


 

 

一致性锁定读的SQL语法

-- 排他锁
SELECT ......  FOR UPDATE

-- 共享锁
SELECT ...... LOCK IN SHARE MODE

 

 

 

自增锁

-- 内部用下列方式实现的
SELECT max(auto_inc_col) FROM t FOR UPDATE;

MySQL 5.1.22版本开始,InnoDB提供了一种轻量级互斥量的自增长实现机制,这种机制大大提高了自增长插入的性能。

InnoDB提供了一个参数innodb_autoinc_lock_mode来控制自增长的模式,该参数的默认值为1,在继续讨论新的自增长实现方式之前,需要对自增长的插入进行分类

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值