数据库事务和锁定之间的确切关系是什么?

Lai*_*son 18 transaction locking

这是一个谦虚的问题,本着增加我的知识的精神提出的;请温柔地回应。

作为一名长期的应用程序开发人员,我在某种程度上知道事务是什么(我一直在使用它们)。暂且不谈事务隔离级别,在较高级别上,事务允许完全完成或根本不完成工作块,并允许与其他数据库修改活动进行一定程度的隔离。

我还知道(在各种数据库中)锁是什么,或者至少知道一个锁的行为(如果我以某种方式明确地锁定一个表,那么没有其他进程或线程可以更新有关该表的任何内容)。

我现在最明显的明确的是:在各种数据库中,当我明确地锁定一行或一台,我在用人所使用的数据库的交易设施在幕后进行交易正常工作完全一样的结构?

也就是说,我突然想到,为了使事务具有原子性和隔离性,它必须进行一些锁定。这个事务启动的、事务隐藏的锁定是否与各种数据库让我通过诸如SELECT FOR UPDATE或显式LOCK命令之类的结构访问的锁定类型相同?还是这两个概念完全不同?

再次,我为这个问题的幼稚道歉;我很高兴被指出更基础的来源。

Rem*_*anu 13

当我显式锁定一行或一个表时,我是否使用了与数据库的事务工具在幕后使用的完全相同的构造来使事务正常工作?

是的。如果这不是真的,那么您自己的“锁定”将仅适用于其他类似的“锁定”,而不会与引擎自己的锁定进行交互。因此,您将锁定表中的一行,使其无法以相同的方式被另一个应用程序锁定,但引擎本身会忽略您的锁定。很少需要这些语义。大多数情况下,应用程序锁定一行意味着“将其锁定以防止任何访问/修改方式”。请注意,严格特定于应用程序的锁定机制确实存在,因为它们很有用。例如 SQL Server 有应用程序锁

我突然想到,为了使事务具有原子性和隔离性,它必须进行一些锁定。

锁定是实现这一目标的一种手段。主要的替代方法是版本控制。现在大多数数据库都支持两者(这也意味着如果您在应用程序中“锁定”一行,但另一个事务使用版本控制来读取该行,它将读取它,因为您的锁定不会阻止版本化读取)。

您有点绕着数据库实现世界中称为“两阶段锁定协议”的概念。链接的维基百科文章是一个很好的开端。如果您想阅读有关此主题的更详细说明,我建议您前往图书馆并要求借阅交易处理:概念和技术。几乎每个数据库的核心都是那本书的实现。