上QQ阅读APP看本书,新人免费读10天
设备和账号都新为新人
读写锁
从电子表格中读取数据不会有什么麻烦,即使很多人同时读取也不会有问题。因为读取操作不会修改数据,所以不太可能出错。如果有人试图删除A25单元格中的内容,而其他人正在读取电子表格,会发生什么情况?这要视情况而定,读取者可能遇到报错退出,也可能得到不一致的数据视图。为安全起见,即使是从电子表格中读取数据也需要特别小心。
如果把上述电子表格看作数据库中的表,很容易发现也会有同样的问题。从很多方面来说,电子表格就是一张简单的数据库表。修改数据库表中的记录,和删除或者修改电子表格文件中的单元格内容十分类似。
并发控制这一经典问题的解决方案相当简单。处理并发读/写访问的系统通常实现一个由两种锁类型组成的锁系统。这两种锁通常被称为共享锁(shared lock)和排他锁(exclusive lock),也叫读锁(read lock)和写锁(write lock)。
先不考虑具体的锁定机制,锁的概念可以如下描述:资源上的读锁是共享的,或者说是相互不阻塞的。多个客户端可以同时读取同一个资源而互不干扰。写锁则是排他的,也就是说,一个写锁既会阻塞读锁也会阻塞其他的写锁,这是出于安全策略的考虑,只有这样才能确保在特定的时间点只有一个客户端能执行写入,并防止其他客户端读取正在写入的资源。
在实际的数据库系统中,每时每刻都在发生锁定:当某个客户端在修改某一部分数据时,MySQL会通过锁定防止其他客户端读取同一数据。如果数据库服务器以可接受的方式执行,锁的管理速度足够快,那么不会引起客户端的感知。我们将在第8章中讨论如何调整查询以避免锁引起的性能问题。