在数据库中,行级锁定是 ACID、乐观并发或两者的示例吗?
In databases, is row level locking an example of ACID, optimistic concurrency, or both?
同时写入
还有在 nosql 数据库中会发生什么?
我将忽略 NoSQL 部分,否则我将不得不关闭这个问题,因为它太没有重点了。
行级锁定是关系数据库用来提供隔离的一种技术,这是ACID的I。隔离意味着并发数据库会话彼此隔离——数据库试图使它们不受彼此活动的影响。
具体来说,如果两个并发会话试图修改同一个数据行,它们必须“轮流”:第二个会话必须等到第一个会话的事务完成。这种等待通常很短,不会造成伤害,但它可以防止不一致(一致性 是 ACID 的 C)。
行级锁定和一般锁定是悲观锁定的一部分:您锁定一行以防止其他会话在您处理该行时弄乱该行。这是用 SELECT ... FOR UPDATE
完成的。之所以称为“悲观”,是因为它反映了一种心态,例如“我希望有人会在我处理该行时尝试修改该行,所以让我们锁定它以确保万无一失”。
乐观锁是ill-named,因为实际上没有锁。您不会阻止并发事务修改您感兴趣的行。相反,您事后检查该行是否已被并发事务修改,如果已修改,则再次尝试该操作。
同时写入
还有在 nosql 数据库中会发生什么?
我将忽略 NoSQL 部分,否则我将不得不关闭这个问题,因为它太没有重点了。
行级锁定是关系数据库用来提供隔离的一种技术,这是ACID的I。隔离意味着并发数据库会话彼此隔离——数据库试图使它们不受彼此活动的影响。
具体来说,如果两个并发会话试图修改同一个数据行,它们必须“轮流”:第二个会话必须等到第一个会话的事务完成。这种等待通常很短,不会造成伤害,但它可以防止不一致(一致性 是 ACID 的 C)。
行级锁定和一般锁定是悲观锁定的一部分:您锁定一行以防止其他会话在您处理该行时弄乱该行。这是用 SELECT ... FOR UPDATE
完成的。之所以称为“悲观”,是因为它反映了一种心态,例如“我希望有人会在我处理该行时尝试修改该行,所以让我们锁定它以确保万无一失”。
乐观锁是ill-named,因为实际上没有锁。您不会阻止并发事务修改您感兴趣的行。相反,您事后检查该行是否已被并发事务修改,如果已修改,则再次尝试该操作。