mysql的并发控制
Posted imcati
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了mysql的并发控制相关的知识,希望对你有一定的参考价值。
并发即指在同一时刻,多个操作并行执行。mysql对并发的处理主要应用了两种机制——是"锁"和"多版本控制"。
1、 并发控制
MySQL提供两个级别的并发控制:服务器级(the server level)和存储引擎级(the storage engine level)。加锁是实现并发控制的基本方法,MySQL中锁的粒度:
(1) 表级锁:MySQL独立于存储引擎提供表锁,例如,对于ALTER TABLE语句,服务器提供表锁(table-level lock)。
(2) 行级锁:InnoDB和Falcon存储引擎提供行级锁,此外,BDB支持页级锁。InnoDB的并发控制机制,下节详细讨论。
另外,值得一提的是,MySQL的一些存储引擎(如InnoDB、BDB)除了使用封锁机制外,还同时结合MVCC机制,即多版本并发控制(Multi-Version Concurrent Control),来实现事务的并发控制,从而使得只读事务不用等待锁,提高了事务的并发性。
锁的分类
共享锁:也称为读锁,读锁允许多个连接可以同一时刻并发的读取同一资源,互不干扰;
排他锁:也称为写锁,一个写锁会阻塞其他的写锁或读锁,保证同一时刻只有一个连接可以写入数据,同时防止其他用户对这个数据的读写。
2、事务处理
2.1 事务的ACID特性
数据库的事务处理的原则是保证ACID的正确性。
事务是由一组SQL语句组成的逻辑处理单元,事务具有以下4个属性:
(1) 原子性(Atomicity):事务是一个原子操作单元,其对数据的修改,要么全都执行,要么全都不执行,不可能只执行其中的一部分。(不可分割)
(2) 一致性(Consistent):在事务开始和完成时,数据都必须保持一致状态。这意味着所有相关的数据规则都必须应用于事务的修改,以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的。(状态更改一致性)
(3) 隔离性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行。这意味着事务处理过程中的中间状态对外部是不可见的。(执行过程隔离不可见)
(4)m持久性(Durable):事务完成之后,它对于数据的修改是永久性的,即使出现系统故障也能够保持。(持久生效)
2.2、事务处理带来的相关问题
由于事务的并发执行,带来以下一些著名的问题:
(1) 更新丢失(Lost Update):当两个或多个事务选择同一行,然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在,就会发生丢失更新问题--最后的更新覆盖了由其他事务所做的更新。
(2) 脏读(Dirty Reads):一个事务正在对一条记录做修改,在这个事务完成并提交前,这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录,如果不加控制,第二个事务读取了这些"脏"数据,并据此做进一步的处理,就会产生未提交的数据依赖关系。这种现象被形象地叫做"脏读"。
(3) 不可重复读(Non-Repeatable Reads):一个事务在读取某些数据后的某个时间,再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫做"不可重复读"。
(4) 幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为"幻读"。
以上是关于mysql的并发控制的主要内容,如果未能解决你的问题,请参考以下文章