在一个事务中对数据D加共享锁后,通常是不能在同一个事务中再对D加排他锁的。这是因为:
- 共享锁(Shared Lock,也称读锁)允许多个事务同时读取数据,但不允许写入。
- 排他锁(Exclusive Lock,也称写锁)则要求独占访问,不允许其他事务同时读取或写入数据。
- 当一个事务已经持有共享锁时,再请求排他锁会导致锁升级(Lock Escalation)。
- 大多数数据库系统不支持锁升级,因为它可能导致死锁。
- 如果允许锁升级,可能会破坏数据库的并发控制机制,影响事务的隔离性。
因此,一般来说,在同一个事务中,如果已经对数据D加了共享锁,就不能再对其加排他锁。正确的做法是:
- 如果事务需要写入数据,应该从一开始就请求排他锁。
- 或者先释放共享锁,然后再请求排他锁(但这可能会导致其他问题,如不可重复读)。
不过,具体的行为可能会因数据库管理系统的不同而略有差异。在实际应用中,建议仔细查阅所使用的特定数据库系统的文档,以了解其锁机制的具体实现和限制。