从邮箱中读取数据没有这样的麻烦,即使同一时刻多个用户并发读取也不会有什么问题。
因为读取不会修改数据,所以不会出错。但如果某个客户正在读取邮箱,同时另外一个
用户试图删除编号为25的邮件,会产生什么结果?结论是不确定,读的客户可能会报
错退出,也可能读取到不一致的邮箱数据。所以,为安全起见,即使是读取邮箱也需要
特别注意。
如果把上述的邮箱当成数据库中的一张表,把邮件当成表中的一行记录,就很容易看出,
同样的问题依然存在。从很多方面来说,邮箱就是一张简单的数据库表。修改数据库表
中的记录,和删除或者修改邮箱中的邮件信息,十分类似。
解决这类经典问题的方法就是并发控制,其实非常简单。在处理并发读或者写时,可以通过实现一个由两种类型的锁组成的锁系统来解决问题。这两种类型的锁通常被称为共享锁( shared lock)和排他锁( exclusive lock),也叫读锁( read lock)和写锁( write lock)
这里先不讨论锁的具体实现,描述一下锁的概念如下:读锁是共享的,或者说是相互不阻塞的。多个客户在同一时刻可以同时读取同一个资源,而互不干扰。写锁则是排他的,也就是说一个写锁会阻塞其他的写锁和读锁,这是出于安全策略的考虑,只有这样,才能确保在给定的时间里,只有一个用户能执行写入,并防止其他用户读取正在写入的同资源。
在实际的数据库系统中,每时每刻都在发生锁定,当某个用户在修改某一部分数据时,
MySQL会通过锁定防止其他用户读取同一数据。大多数时候, MySQL锁的内部管理都
是透明的。