我试图阻止在oracle中使用select for update
进行插入。例如,假设在一个会话中(自动提交关闭,隔离级别=可序列化)地址表不包含行,我在SESSION1中这样做:
SESSION1: select * from Address where addressID = 1 for update
现在在第二阶段:
SESSION2:insert into Address (addressID, street, city,zip) values (1, 'main','ny','12345'); commit;
我早就想到被屏蔽了。然而,我发现插入发生了。我可以promise。然后在会话1中。
SESSION1: insert into Address (addressID, street, city,zip) values (1, 'main','ny','12345')
即使在提交之前,也会出现完整性约束错误。(不是我预期的可序列化异常)。
为什么会发生这种情况?我使用的是oracle 12c。有几个意想不到的结果。首先,为什么我在提交之前就在Session1中收到约束错误?Oracle不应该看到来自另一个会话的插入。其次,Session1中的插入不应该由于“用于更新”选择而被阻止吗?最后,有没有办法阻止特定键的插入?
有关可序列化隔离级别的信息,请参见http://www . Oracle . com/tech network/issue-archive/2010/10-Jan/o65 ask Tom-082389 . html。
这种程度的隔离是有代价的,这个代价就是以下可能的错误:
ERROR at line 1: ORA-08177: can't serialize access for this transaction
每当您尝试更新自事务开始以来已更改的行时,您都会收到此消息。(请注意,Oracle 尝试纯粹在行级别执行此操作,但即使您有兴趣修改的行尚未修改,也可能会收到 ORA-08177 错误。ORA-08177 可能是由于在包含您的行的块上修改了其他一些行而发生的。
在您的情况下,它并不完全是更新,但想法是一样的。如果您查询表,它不会“看到”它,因为它从回滚段读取。但插入不同,因为它需要访问真实数据以确保一致性。
至于如何解决这个问题,请使用命名锁。他们仍然工作,虽然他们不应该:)
Alter session set isolation_level=serializable;
declare
v_lockhandle varchar2(128);
v_result number;
begin
dbms_lock.allocate_unique('table_name'||'id'
,v_lockhandle);
v_result := dbms_lock.request(v_lockhandle
,release_on_commit => true
,lockmode => 6 -- exclusive
,timeout => 0);
dbms_output.put_line('result: '||v_result);
end;
/
问题内容: 我最近开始学习使用myBatis。现在面对这样的情况,我需要通过WebService不断获取新的对象列表,然后对于该列表,我需要通过以下方式将每个对象插入/更新到oracle DB表中: myBatis。 棘手的部分是,我不能每次都简单地进行批量插入,因为某些对象可能已经存在于数据库中,对于这些记录,我需要更新它们的字段而不是新插入。 我当前的解决方案可能非常愚蠢,使用Java,从We
问题内容: 是否可以为表的插入和更新事件触发mysql触发器? 我知道我可以做到以下几点 但是我该怎么办 是否可以,或者我必须使用2个触发器?两者的代码都相同,我不想重复。 问题答案: 您必须创建两个触发器,但是您可以将通用代码移动到过程中并使它们都调用过程。
我创建了一个用于插入和更新的SQL触发器,它基本上执行以下操作: 从插入的表中获取LineID(表的PrimaryID)和RegionID,并将其存储在INT变量中。然后,它对连接表进行检查,以找到RegionID应该是什么,如果RegionID不等于插入表中应该是什么,那么它应该更新该记录。 我的问题是,它没有更新记录,我猜,这是因为记录还没有插入到PurchaseOrderLine表中,我正在
问题内容: 我使用以下查询在弹性中创建了一个索引: 我想使用.net NEST库将文档插入此索引。我的问题是.net更新方法的签名对我没有任何意义。 Java库对我来说意义更大: 在NEST中,和类来自哪里?我制作的这些C#类代表我的索引吗? 问题答案: 并且是为POCO类型的泛型类型参数 在Elasticsearch()中表示文档,然后 执行部分更新时,在Elasticsearch()中表示文档
插入、更新和删除语句基于以开头的层次结构生成 UpdateBase . 这个 Insert 和 Update 构建基于中介的 ValuesBase . DML基础构造函数 顶级的“插入”、“更新”、“删除”构造函数。 Object Name Description delete(table[, whereclause, bind, returning, ...], **dialect_kw) 构建
我的用户表有以下存储库界面。 我想禁用在用户表中插入新实体,并仅在存在现有条目的情况下使用保存功能来更新现有条目。我如何才能做到这一点?是否有可以传递到存储库界面的选项?或者,当没有匹配的实体时,我应该重写save方法而不执行任何操作吗?