想象一下,我有一个简单的表:
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在哪里/如何管理事务,以便它甚至在尚未提交事务时就知道我违反了约束。
Oracle创建一个索引以强制执行主键约束(默认情况下为唯一索引)。当会话A插入第一行时,索引结构将更新,但不会提交更改。当会话B尝试插入第二行时,索引维护操作会注意到索引中已经存在带有该特定键的未决条目。会话B无法获取保护共享索引结构的闩锁,因此它将阻塞,直到会话A的事务完成为止。届时,会话B要么能够获取锁存器并对其进行修改(因为A回滚了),要么它将注意到另一个条目已经提交,并且将抛出唯一的约束冲突(因为A提交了))。