当前位置: 首页 > 面试题库 >

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

葛承德
2023-03-14
问题内容

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

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

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

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

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

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

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


问题答案:

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



 类似资料:
  • 本文向大家介绍Oracle中死事务的检查语句,包括了Oracle中死事务的检查语句的使用技巧和注意事项,需要的朋友参考一下 查询v$px_session和v$fast_start_servers,显示很多并行进程在rollback,根据以往的工程经验: 于是改为 之后,再次运行 使用如下脚本查看回滚完毕的预计时间(以天为单位): 24*0.21=5.04小时。即:预计5.04小时后回滚完毕。 另外

  • 问题内容: 我需要特定的业务场景来在实体(不是PK)上的字段中设置序列中的数字(序列必须是介于min和max之间的数字 我定义了这样的序列: 在Java代码中,我从这样的序列中检索数字: 我的问题是: 如果我在一个事务中调用此“ ”,并且在另一个事务中同时调用了同一方法(并行请求),则可以确定该序列返回的值是否不同? 不可能像从第一笔交易中读取未提交的值吗? 因为让我们说我不会使用序列和一个普通的

  • 主要内容:Oracle SELECT示例在本教程中,将学习如何使用Oracle SELECT语句从单个表中查询数据。 在Oracle中,表是由列和行组成。 例如,示例数据库中的表具有以下列:,,,和。表中这些列中也有对应的数据。 要从表的一个或多个列(,,,)中检索数据,请使用以下语法的语句: 在这个语句中: 首先,需要指定要查询数据的表名。 其次,指定想要返回数据的列。 如果需要返回多个列,则需要用逗号()将这些列分隔。 请注意,SE

  • 问题内容: 我有一个存储过程。我在这里传递一个布尔值,例如IS_ELIGIBLE。现在,我希望能够编写如下查询: 问题是由于IS_ELIGIBLE不是TABLE_NAME中的列之一,查询出错了。我可以使用if..else即写相同的查询。 但是我将重复两次select语句。我知道我可以创建具有该select语句的函数,这样我就不必重复两次。但是我只是很好奇是否可以在不执行if..else或创建新函数

  • 问题内容: 我需要从存储过程中写入日志表。现在,此日志信息必须能够在回滚过程中幸免。 我知道以前曾问过这个问题,但是我的情况有所不同,在这些问题中找不到我的问题的答案。 当存储过程中没有错误时,事情就很简单了,日志表中的条目就在那里。 当有错误时,事情就变得复杂了。 在该过程中,我可以在catch中进行回滚,然后将数据插入日志表,我知道并且我已经在这样做了。 但是问题是当存储过程这样调用时: 我知

  • 我需要将adminer与oracle连接,但在官方映像中不支持它。是否有用于oracle连接的管理员映像?或者如果有人可以指导我如何在当前映像中安装oci8扩展。