您的位置:首页 > 数据库 > MySQL

【笔记】Mysql 锁与事务

2016-07-28 16:08 309 查看
不可重复读:一个事务内多次读取同一数据集合,由于其它事务的影响,这个事务内俩次读到的数据不一样。

不可重复读的示例



在InnoDB存储引擎中,使用Next-Key Lock算法来避免不可重复读的问题。在Mysql官方文档中将不可重复读的问题定义为Phantom Problem,即幻像问题。

在Next-Key Lock算法下,对于索引的扫描,不仅是锁住了扫描到的索引,而且还锁住这些索引覆盖的范围(gap)。因此在这个范围内不允许插入,避免了不可重复度的问题。

InnoDB存储引擎的默认事务隔离级别是READ REPEATABLE是能避免不可重复读的现象。

show engine innodb status 及

innodb_trx、innodb_locks、innodb_lock_waits

在默认的事务隔离级别下(REPEATABLE READ),InnoDB存储引擎采用Next-Key Locking机制来避免Phantom Problem(幻像问题),Phantom Problem是指在同一事务下,连续执行俩次同样的SQL语句可能导致不同的结果,

第二次的SQL语句可能会返回之前不存在的行。违反了事务的隔离性。

脏页:在缓冲池中已经被修改的页,但是还没有刷新到磁盘中。

脏数据:事务对缓冲池中行记录的修改,并且还没有被commit。

不可重复读:一个事务内多次读取同一数据集合,由于其它事务的影响,这个事务内俩次读到的数据不一样。

在InnoDB存储引擎中,使用Next-Key Lock算法来避免不可重复读的问题。在Mysql官方文档中将不可重复读的问题定义为Phantom Problem,

即幻像问题。

在Next-Key Lock算法下,对于索引的扫描,不仅是锁住了扫描到的索引,而且还锁住这些索引覆盖的范围(gap)。因此在这个范围内不允许

插入,避免了不可重复度的问题。

InnoDB存储引擎的默认事务隔离级别是READ REPEATABLE是能避免不可重复读的现象。

丢失更新是另一个锁导致的问题,简单来说就是一个事务的更新操作会被另一个事务的更新操作所覆盖,从而导致数据的不一致。

1)事务T1将行记录r更新为v1。

2)与此同时,事务T2将行记录r更新为v2。

3)事务T1提交

4)事务T2提交

innodb_lock_wait_timeout用来控制等待的时间(默认50秒)

innodb_rollback_on_timeout用来设定是否在等待超时时对进行中的事务进行回滚操作(默认是OFF,代表不回滚)。

参数innodb_lock_wait_timeout是动态的,可以在MySQL数据库运行时修改。

SET @@innodb_lock_wait_timmeout=60;

而innodb_rollback_on_timeout是静态的,不可在启动时进行修改。

死锁

解决死锁问题最简单的一种方法是超时。

当前数据库还普遍采用wait-for graph(等待图)的方式来进行死锁检测。

这是一种更为主动的死锁检测方式。wait-for graph要求数据库保存以下俩种信息:

锁的信息链表

事务等待链表

在每个事务请求锁并发生等待时都会判断是否存在回路,若存在则有死锁,通常会选择回滚

undo量最小的事务。

事务发生死锁的概率和以下几点因素有关:

系统中事务的数量,越多概率越大。

每个事务操作的数量(r),r越多,死锁概率越大。

操作数据的集合R,越小死锁概率越大。
内容来自用户分享和网络整理,不保证内容的准确性,如有侵权内容,可联系管理员处理 点击这里给我发消息
标签: