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

标签 sql oracle oracle10g dml

假设我有这个简单的表格:

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/

相关文章:

.net - OracleBulkCopy 不支持触​​发器

java - 将csv文件加载到oracle数据库

python - 导入 cx_Oracle 模块时出错 [Python]

java - 日期值设置为 NULL 时的原始 SQL 更新语句

mysql - 具有多个 WHERE 子句的 SQL Like 语句

linux - 我需要在 oracle 数据库卡住时测试我的应用程序的行为。因此我需要模拟 oracle DB freeze

oracle10g - 在 Oracle 中,使用序列作为代理主键被视为标准

hibernate - Hibernate 3.2.6.ga 中的 LocalDateTime (Joda-Time) 映射

sql - 如何让 postgres 忽略带有重复键的插入但继续

sql - 如何进行自连接