1.2. 并发控制任何时候只要有多个查询语句想要改变同一条数据时并发控制的问题就出现了。根据这一章的描述,MySQL在需要在两个层面来解决这个问题:服务器层面和存......
1.2. 并发控制
任何时候只要有多个查询语句想要改变同一条数据时并发控制的问题就出现了。根据这一章的描述,MySQL在需要在两个层面来解决这个问题:服务器层面和存储引擎层面。并发控制是一个很大的课题,同时也有一大批关于并发控制的专著,但是本书的着眼点并不在于并发控制的理论或者MySQL的内部实现。因此我们只打算给读者一个关于如何处理并发读操作和并发写操作的概述,因此读者可以在本章的其余部分看到这部分内容。
我们用Unix系统中的电子邮件箱来作为例子说明这个问题。经典的mbox文件格式很简单。mbox邮件箱中的所有邮件被一个一个连接在一起。这使得邮件消息很容易阅读和解析。它也使得邮件接收变得很简单,只需要将新邮件附加到mbox文件尾就可以了。
但是当两个不同的进程同时接收邮件到同一个邮箱时会发生什么事情呢?很显然那个邮件箱会崩溃,因为它里面会出现两个交织在一起的邮件。一个好的邮件系统会使用锁来阻止这种崩溃。当一个客户在邮件箱被锁定的情况下往邮件箱里写入第二封邮件的时候,它必须一直等待直到它拿到那个锁。
这个方案在现实世界中运行地很好,但是它却不能提供并发性。这种方式在一个大容量邮箱的情况下会很有问题,因为在指定时间里只有一个进程可以改变邮箱的内容。
1.2.1. 读写锁
从邮箱中读邮件不是问题。多个客户端同时读一个邮箱一点问题都没有,因为他们不会做出任何改动,因此所有的事情都不会出错。但是当有人试图删除第25个邮件而另外的程序正在读这个邮件时会发生什么事呢?这就不一定了,读者可能得到一个崩溃和或者不一致的邮箱视图。因此从安全上来说,即使是从邮箱中读邮件也需要额外注意。
如果你把邮箱看成数据库中的表,而把一个个邮件看成数据库表中的数据行,那么前面谈论到的邮箱中存在的问题在数据库中同样存在。从各方面来说,邮箱可以看成一个简单的数据库。修改数据库表中的数据行与删除或者更新邮箱中的邮件十分相似。
解决这个经典的并发控制问题的方法十分简单。处理并发读写访问的系统实际上实现了一个由两种不同类型的锁组成的锁定系统。这些锁被称为“共享锁”和“互斥锁”或者叫“读锁”和“写锁”。
1/3 1 2 3 下一页 尾页 |