在数据库和一些并发控制场景中,读锁(共享锁,Shared Lock,简称 S 锁)和写锁(排他锁,Exclusive Lock,简称 X 锁 )会存在冲突情况,具体如下:
读锁和读锁之间
读锁之间是不冲突的。当一个事务对数据对象加上读锁后,其他事务也可以对同一数据对象加读锁。因为多个事务同时读取数据,并不会对数据的一致性造成破坏, 多个事务可以并发读取数据,提高了并发读的性能。
例如,在图书馆系统中,多个读者可以同时查看某本书的借阅记录,他们获取的就是关于借阅记录数据的读锁,相互之间不影响。
读锁和写锁之间
读锁和写锁是冲突的。当一个事务对数据对象加上写锁后,其他事务既不能对该数据对象加读锁,也不能加写锁;而当数据对象上已经有读锁存在时,其他事务不能对该数据对象加写锁。
这是因为写操作会修改数据,如果在写操作进行时允许其他事务读数据,可能会读到不一致的数据;而如果在有读操作进行时允许写操作,写操作会破坏正在被读的数据的一致性。
比如在电商系统中,当一个商家要修改商品的价格(加写锁进行写操作),就不允许其他用户在这期间读取该商品价格(不能加读锁),避免用户读到错误的价格数据;同样,如果有很多用户正在浏览商品价格(加了读锁),也不能让商家立即修改价格(不能加写锁),以免干扰用户的正常浏览。
写锁和写锁之间
写锁和写锁也是冲突的。同一时间内,只能有一个事务对数据对象加写锁并进行写操作,不允许其他事务对同一数据对象加写锁,否则会导致数据更新的混乱,破坏数据一致性。
例如在文件系统中,不允许两个进程同时对同一个文件进行写入修改,因为这可能会导致文件内容错乱。