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

con*_*att 2 sql oracle oracle10g dml

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

Table Name: Table1
Columns:    Col1 NUMBER (Primary Key)
            Col2 NUMBER
Run Code Online (Sandbox Code Playgroud)

如果我将记录插入Table1而没有提交...

INSERT INTO Table1 (Col1, Col2) Values (100, 1234);
Run Code Online (Sandbox Code Playgroud)

Oracle如何知道下一个INSERT语句违反了PK约束,因为尚未向数据库提交任何内容.

INSERT INTO Table1 (Col1, Col2) Values (100, 5678);
Run Code Online (Sandbox Code Playgroud)

Oracle在何处/如何管理事务,以便在我尚未提交事务时知道我违反了约束.

Jus*_*ave 8

Oracle创建一个索引来强制执行主键约束(默认情况下为唯一索引).会话A插入第一行时,将更新索引结构,但不会提交更改.当会话B尝试插入第二行时,索引维护操作会注意到索引中已存在具有该特定键的挂起条目.会话B无法获取保护共享索引结构的锁存器,因此它将阻塞直到会话A的事务完成.此时,会话B将能够获取锁存器并对索引进行自己的修改(因为A回滚)或者它将注意到另一个条目已经提交并将抛出唯一的约束违规(因为A已提交) ).