假设我有这个简单的表格:
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 创建一个索引来强制执行主键约束(默认情况下是唯一索引)。当 session A 插入第一行时,索引结构会更新,但不会提交更改。当 session B 尝试插入第二行时,索引维护操作注意到索引中已经有一个具有该特定键的挂起条目。 session B 无法获取保护共享索引结构的闩锁,因此它将阻塞,直到 session A 的事务完成。届时, session B 将能够获取闩锁并对索引进行自己的修改(因为 A 回滚),或者它会注意到另一个条目已提交并抛出唯一约束违规(因为 A 提交).
关于sql - Oracle - Oracle 如何管理特定于事务的 DML 语句,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7068767/