共享锁和排他锁的区别
确保事务中隔离属性的方法之一是要求以互斥的方式访问数据项。这意味着,当一个事务正在访问一个数据项时,没有其他事务可以修改该数据项。因此,实现需求最常用的方法是允许事务仅在当前持有数据项上的锁时才访问该数据项。因此,需要锁定操作来确保事务的隔离。
共享锁(S)
另一个试图读取相同数据的事务被允许读取,但试图更新数据的事务将被阻止,直到共享锁被释放。
共享锁也称为读锁,仅用于读取数据项。
共享锁支持读完整性。它们确保在只读请求期间记录不处于更新过程中。
共享锁还可以用于防止任何类型的记录更新。
它用locks – s表示。
使用locks – s指令请求S-lock。
例如,考虑一种情况,最初a =100,有两个事务正在读取a。如果其中一个事务想要更新a,在这种情况下,其他事务将读取错误的值。但是,Shared锁会阻止它在读取完成之前进行更新。
排他锁(X)
- 当语句修改数据时,其事务对数据持有排他锁,以阻止其他事务访问该数据。
- 该锁将一直保持,直到持有该锁的事务发出提交或回滚。
- 它们一次只能被一个交易拥有。
- 使用排他锁,可以读取和写入数据项。也称为写锁。
- 如果另一个事务当前拥有针对所请求资源的独占锁或共享锁,则任何需要独占锁的事务都必须等待。
- 它们一次只能被一个交易拥有。
- 它被表示为Lock-X。
- 使用Lock-X指令请求X-lock。
例如,考虑一种情况,当一个事务需要从a中扣除50时,最初的a =100。我们可以通过在该事务上放置X锁来允许该事务。因此,当任何其他事务想要读或写时,排他锁阻止它。锁兼容性矩阵:
锁的兼容性矩阵
- 如果事务T1持有数据项a中的共享锁,那么控制管理器可以将共享锁授予事务T2,因为兼容性为TRUE,但它不能将独占锁授予事务T2,因为兼容性为FALSE。
- 简单地说,如果事务T1正在读取数据项a,那么同一数据项a可以由另一个事务T2读取,但不能由另一个事务写入。
- 类似地,如果某个事务的数据项上持有一个排他锁(即用于读写操作的锁),那么其他事务就不能获得共享或排他锁,因为相容性函数表示为FALSE。
共享锁与排他锁的区别:
编号 | 共享锁 | 排他锁 |
---|---|---|
1 | 锁定模式为只读操作。 | 锁定模式是读和写操作。 |
2 | 共享锁可以放置在没有排他锁的对象上。 | 排他锁只能放置在没有任何其他类型锁的对象上。 |
3 | 阻止其他人更新数据。 | 阻止其他人读取或更新数据。 |
4 | 当事务想读取没有排他锁的项时发出。 | 当事务想要更新未锁定的项目时发出。 |
5 | 任意数量的事务都可以持有一个项目上的共享锁。 | 排他锁只能被一个事务持有。 |
6 | 使用locks – s指令请求S-lock。 | 使用lock-X指令请求X-lock。 |