小编典典

Oracle-Oracle如何管理特定于事务的DML语句

sql

想象一下,我有一个简单的表:

Table Name: Table1
Columns:    Col1 NUMBER (Primary Key)
            Col2 NUMBER

如果我在没有提交的情况下将记录插入到Table1中…

INSERT INTO Table1 (Col1, Col2) Values (100, 1234);

Oracle怎么知道下一条INSERT语句违反了PK约束,因为尚未将任何内容提交给数据库。

INSERT INTO Table1 (Col1, Col2) Values (100, 5678);

Oracle在哪里/如何管理事务,以便它甚至在尚未提交事务时就知道我违反了约束。


阅读 195

收藏
2021-04-14

共1个答案

小编典典

Oracle创建一个索引以强制执行主键约束(默认情况下为唯一索引)。当会话A插入第一行时,索引结构将更新,但不会提交更改。当会话B尝试插入第二行时,索引维护操作会注意到索引中已经存在带有该特定键的未决条目。会话B无法获取保护共享索引结构的闩锁,因此它将阻塞,直到会话A的事务完成为止。届时,会话B要么能够获取锁存器并对其进行修改(因为A回滚了),要么它将注意到另一个条目已经提交,并且将抛出唯一的约束冲突(因为A提交了))。

2021-04-14