当前位置:   article > 正文

gfdmp和mysql,《高性能MySQL》读书笔记--锁、事务、隔离级别

p5gn.sbs

1.锁为什么需要锁?因为数据库要解决并发控制问题。在同一时刻,可能会有多个客户端对表中同一行记录进行操作,比如有的在读取该行数据,其他的尝试去删除它。为了保证数据的一致性,数据库就要对这种并发操作进行控制,因此就有了锁的概念。1.1锁的分类从对数据操作的类型(读写)分

读锁(共享锁):针对同一块数据,多个读操作可以同时进行而不会互相影响。

写锁(排他锁):当前写操作没有完成前,它会阻断其他写锁和读锁。

大多数时候,MySQL锁的内部管理都是透明的。1.2锁粒度(Lock granularity)为了尽可能提高数据库的并发度,每次锁定的数据范围越小越好,理论上每次只锁定当前操作的数据的方案会得到最大的并发度,但是管理锁是很耗资源的事情(涉及获取,检查,释放锁等动作),因此数据库系统需要在高并发响应和系统性能两方面进行平衡,这样就产生了“锁粒度(Lock granularity)”的概念。

表锁:管理锁的开销最小,同时允许的并发量也最小的锁机制。MyIsam存储引擎使用的锁机制。当要写入数据时,把整个表都锁上,此时其他读、写动作一律等待。在MySql中,除了MyIsam存储引擎使用这种锁策略外,MySql本身也使用表锁来执行某些特定动作,比如alter table.

另外,写锁比读锁有更高的优先级,因此一个写锁可能会被插入到读锁队列的前面。

行锁:可以支持最大并发的锁策略(同时也带来了最大的锁开销)。InnoDB和Falcon两张存储引擎都采用这种策略。行级锁只在存储引擎层实现,而MySQL服务器层没有实现。服务器层完全不了解存储引擎中的锁实现。

MySql是一种开放的架构,你可以实现自己的存储引擎,并实现自己的锁粒度策略,不像Oracle,你没有机会改变锁策略,Oracle采用的是行锁。

1.3死锁(Dead Lock)死锁是指两个或者多个事务在同一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的假象。多个事务同时锁定同一个资源时,也会产生死锁。数据库系统实现了各种死锁检测和死锁超时的机制,InnoDB目前处理死锁的方法是,将持有最少行级排他锁的事务进行回滚。

2.事务(Transaction)

2.1事务ACID原则从业务角度出发,对数据库的一组操作要求保持4个特征:

Atomicity(原子性):一个事务必须被视为一个不可分割的最小工作单元,整个事务中的所有操作要么全部提交成功,要么全部失败回滚,对于一个事务来说,不可能只执行其中的一部分操作,这就是事务的原子性。

Consistency(一致性):数据库总是从一个一致性状态转换到另一个一致状态。下面的银行列子会说到。

Isolation(隔离性):通常来说,一个事务所做的修改在最终提交以前,对其他事务是不可见的。注意这里的“通常来说”,后面的事务隔离级级别会说到。

Durability(持久性):一旦事务提交,则其所做的修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。(持久性的安全性与刷新日志级别也存在一定关系,不同的级别对应不同的数据安全级别。)

为了更好地理解ACID,以银行账户转账为例:

1 START TRANSACTION;

2 SELECT balance FROM checking WHERE customer_id = 10233276;

原子性:要么完全提交(10233276的checking余额减少200,savings 的余额增加200),要么完全回滚(两个表的余额都不发生变化)

一致性:这个例子的一致性体现在 200元不会因为数据库系统运行到第3行之后,第4行之前时崩溃而不翼而飞,因为事物还没有提交。

隔离性:允许在一个事务中的操作语句会与其他事务的语句隔离开,比如事务A运行到第3行之后,第4行之前,此时事务B去查询checking余额时,它仍然能够看到在事务A中被减去的200元(账户钱不变),因为事务A和B是彼此隔离的。在事务A提交之前,事务B观察不到数据的改变。

持久性:这个很好理解。

事务跟锁一样都会需要大量工作,因此你可以根据你自己的需要来决定是否需要事务支持,从而选择不同的存储引擎。2.2隔离级别(Isolation Level)

SQL标准定义了4类隔离级别,包括了一些具体规则,用来限定事务内外的哪些改变是可见的,哪些是不可见的。低级别的隔离级一般支持更高的并发处理,并拥有更低的系统开销。

Read Uncommitted(未提交读)

在该隔离级别,所有事务都可以看到其他未提交事务的执行结果。本隔离级别很少用于实际应用,因为它的性能也不比其他级别好多少。读取未提交的数据,也被称之为脏读(Dirty Read)。

Read Committed(提交读)

这是大多数数据库系统的默认隔离级别(但不是MySQL默认的)。它满足了隔离的简单定义:一个事务只能看见已经提交事务所做的改变。这种隔离级别 也支持所谓的不可重复读(Nonrepeatable Read),因为同一事务的其他实例在该实例处理其间可能会有新的commit,所以同一select可能返回不同结果。

Repeatable Read(可重复读)

这是MySQL的默认事务隔离级别,它确保同一事务的多个实例在并发读取数据时,会看到同样的数据行。不过理论上,这会导致另一个棘手的问题:幻读 (Phantom Read)。简单的说,幻读指当用户读取某一范围的数据行时,另一个事务又在该范围内插入了新行,当用户再读取该范围的数据行时,会发现有新的“幻影” 行。InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

这里有介绍MVCC策略:https://blog.csdn.net/xifeijian/article/details/45230053

Serializable(可串行化)

这四种隔离级别采取不同的锁类型来实现,若读取的是同一个数据的话,就容易发生问题。例如:

脏读(Drity Read):某个事务已更新一份数据,另一个事务在此时读取了同一份数据,由于某些原因,前一个RollBack了操作,则后一个事务所读取的数据就会是不正确的。

不可重复读(Non-repeatable read):在一个事务的两次查询之中数据不一致,这可能是两次查询过程中间插入了一个事务更新的原有的数据。

幻读(Phantom Read):在一个事务的两次查询中数据笔数不一致,例如有一个事务查询了几列(Row)数据,而另一个事务却在此时插入了新的几列数据,先前的事务在接下来的查询中,就会发现有几列数据是它先前所没有的。

在MySQL中,实现了这四种隔离级别,分别有可能产生问题如下所示:

229443_0.jpegPHPM/sKwQ6M/VZ2kHHtMRkcPfOoqRvplqickcVbEArMrPfDIq7j3xiW0jd/bmkW49JIrm+LJAn4fqoyXW9QP8Jurl3yKfLEVRq2k3W17Abeuhq+ASt8xDSTyPVGrvi80sqOXylAkS+e47f3bJ3Ilxqwvy7Jvt51Nxcb+N3jrj8Ctq9Z7a98x/HXBb6jU48aGVcv+br7rVfu/9j5+5DEG2VJV9nO7+tru6Vdue0Qq5Gt/+wcOdb3pxDYbXAUqS4vzWCvtasldLDvyxfsmnlGuJTJbu6QUe1EIbnVZVr8nC/gDXlPWbKdRLxj5wTcAnEcfF1rd23rxW+c5L0igVgTcvtj5hi6zYJwEiNI98ia6RQF/zT/J9VrIw/MS6+QGxt971XDTCijIF9Q9cgn3Dl5C29CCVrADv1R8iSp6+wP85tcvYOSPX2MNbSXJvlUxmvteQvrYbbzV3xZjuXmrpVUn/fzf/gE8/Ek0u0DjiWkx88qmLMa+lRQ7RjZodbOtF+NN/0Dre6+h9eLFwnexndj6TI95A2rV9zt7XgDmPsbIxQX8cguTSa/0xe62r38Xk2z7n28fm0qM/bXp9/Dg129aE9f4Vuda9XezfVV9334Htz55Fd0el0kz1m653tn9ymyFCIX8X7j1H0CroSAvvn0Rz7xtJpcl8F94AwDoF7xWwtXSjijWopw3vY5bRmxR+LNvzyCr8hSr3TE0P1kA7v0DHz6RpdcV/Onex1iULwXbuqjS+y18rsuKkT0vSaAGBHRfLHRZkaL9Vkb9Elf7H9QS/qv4fuEXak9E8OqR3w3GqM4n/0S2x1o6NYLjXDb/7CfofNseY7JfxHZZsb9kXgdGxTf+BaR7PkZWKWtfQLkl2H7KTV6XCWdCXZbiI5xcX3zX8lG4LOx5pvga6UQBi/xrwys97+D3f/sGvwnY8xKZNAkPP3kftw68hEP4urg0HtcSadf3QtPIJO37Lv/+BX/f9bsDimXwG7xV4E7oLUb6xR9U0Db0/YO/wPU3NtD29gzOTLcbLjpeGVU9PPuSzO8Xe0xcQOsf7b1L4ZMbf876Pqx/63CM2eNNx47s46Zbic9lwk7nTrDsMWuN1ZD4rsxhcroxouvjjxfnPqLMSHl96ao99p8s4MyXL+GvlguZKOcj8g70K7tPvsbdth/it0rnsfrLNr7rvS1gjEEAdn9RcUJZR/f/0L5m1l8VEDSmzH6vn8Nws/TI561IjDtf/4gxbnSmvnTV7le+mkScsvJD/PbCT/CniwtYk0TiTrJwqeBfwWbOuXcsv9UvMPKaLI/LP6tjOs+0FMrNZeF1pCEvOHPZ8wv86W/fAMp6dwnfv9eLzqZ/s6xpsrz6KrqlA43bOzvbcLUsRcBHg7ckUBECKxhS/V6URbGg63Ew9Il2Dfh+zFQcddh1vIdnhhYwP30JP5/+xpHi0IHCzdLycD7/MToPBj9zEodd7Ps3HMIXeLAeHCE7KpuhZay/iqtiUX/jWT0hlrCRY8rCjbl/Yt5JLvtAvk

声明:本文内容由网友自发贡献,不代表【wpsshop博客】立场,版权归原作者所有,本站不承担相应法律责任。如您发现有侵权的内容,请联系我们。转载请注明出处:https://www.wpsshop.cn/w/你好赵伟/article/detail/643591
推荐阅读
相关标签
  

闽ICP备14008679号