- html - 出于某种原因,IE8 对我的 Sass 文件中继承的 html5 CSS 不友好?
- JMeter 在响应断言中使用 span 标签的问题
- html - 在 :hover and :active? 上具有不同效果的 CSS 动画
- html - 相对于居中的 html 内容固定的 CSS 重复背景?
Oracle数据库11g企业版11.2.0.3.0版-64位生产
我最近加入了一个项目,我的主要工作是清除大量积压的缺陷。这些缺陷之一是不必要的记录重复。我已追究罪魁祸首是...
FUNCTION already_exists (
p_main_thing IN lorem_ipsum.main_id%TYPE, -- NUMBER(10)
p_type IN lorem_ipsum.entity_type%TYPE, -- VARCHAR(256)
p_location IN lorem_ipsum.another_id%TYPE, -- NUMBER(10)
p_start IN lorem_ipsum.start_using%TYPE, -- DATE
p_stop IN lorem_ipsum.stop_using%TYPE -- DATE NULLABLE
) RETURN NUMBER AS
m_counter NUMBER := 0;
BEGIN
SELECT count(eg.pk_id) INTO m_counter
FROM lorem_ipsum eg
WHERE eg.main_id = p_main_thing
AND eg.entity_type = p_type
AND eg.another_id = p_location
AND eg.start_using = p_start
AND NVL(eg.stop_using, TRUNC(SYSDATE-1000000)) = NVL(p_stop, TRUNC(SYSDATE- 1000000));
commit;
IF m_counter > 0 THEN
RETURN 1; -- TRUE
ELSE
RETURN 0; -- FALSE
END IF;
END already_exists;
================================================================================
PROCEDURE prevent_duplicates(
p_main_thing IN lorem_ipsum.main_id%TYPE,
p_type IN lorem_ipsum.entity_type%TYPE,
p_location IN lorem_ipsum.another_id%TYPE,
p_start IN lorem_ipsum.start_using%TYPE,
p_stop IN lorem_ipsum.stop_using%TYPE,
p_new_pk_id OUT lorem_ipsum.pk_id%TYPE, -- NUMBER(10)
p_memory IN OUT NOCOPY short_term_memory ) -- TYPE short_term_memory IS TABLE OF BOOLEAN INDEX BY PLS_INTEGER;
IS
m_new_pk_id lorem_ipsum.pk_id%TYPE;
BEGIN
IF ( already_exists(p_main_thing, p_type, p_location, p_start, p_stop ) = 0 ) THEN
IF ( NOT p_memory.EXISTS( p_main_thing ) ) THEN
m_new_pk_id := pk_id_seq.nextval; -- allowed in 11g ; but not in 10g or lower
insert into lorem_ipsum (pk_id, entity_type, another_id, start_using, stop_using, main_id) values (m_new_pk_id, p_type, p_location, p_start, p_stop, p_main_thing);
commit;
p_memory(p_main_thing) := TRUE;
-- return the new pk_id to the caller
p_new_pk_id := m_new_pk_id;
END IF;
END IF;
-- EXCEPTION
-- ... trap ORA-00001/raise user-defined exception -20999
END prevent_duplicates;
...
org.hibernate.Session hibernate = ...
...
hibernate.beginTransaction();
String orginalLegacyRoutine = "{call myapp.original_legacy_routine("+parentId+", 666)}";
hibernate.createSQLQuery(orginalLegacyRoutine).executeUpdate();
hibernate.getTransaction().commit();
...
hibernate.close
...
...
INFO | jvm 15 | 2015/01/16 20:00:51 | Jan 16, 2015 8:00:51 PM org.apache.catalina.core.ApplicationContext log
INFO | jvm 15 | 2015/01/16 20:00:51 | SEVERE: Exception while dispatching incoming RPC call
INFO | jvm 15 | 2015/01/16 20:00:51 | com.google.gwt.user.server.rpc.UnexpectedException: Service method 'public abstract dba.stackexchange.com.questions.ask.MyApp dba.stackexchange.com.questions.ask.MyAppRPC.addLoremIpsum(dba.stackexchange.com.questions.ask.LoremIpsum,java.lang.String)' threw an unexpected exception: org.hibernate.QueryTimeoutException: could not execute native bulk manipulation query
INFO | jvm 15 | 2015/01/16 20:00:51 | at com.google.gwt.user.server.rpc.RPC.encodeResponseForFailure(RPC.java:389)
INFO | jvm 15 | 2015/01/16 20:00:51 | at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:579)
INFO | jvm 15 | 2015/01/16 20:00:51 | at com.google.gwt.user.server.rpc.RemoteServiceServlet.processCall(RemoteServiceServlet.java:208)
INFO | jvm 15 | 2015/01/16 20:00:51 | at com.google.gwt.user.server.rpc.RemoteServiceServlet.processPost(RemoteServiceServlet.java:248)
INFO | jvm 15 | 2015/01/16 20:00:51 | at com.google.gwt.user.server.rpc.AbstractRemoteServiceServlet.doPost(AbstractRemoteServiceServlet.java:62)
INFO | jvm 15 | 2015/01/16 20:00:51 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:637)
INFO | jvm 15 | 2015/01/16 20:00:51 | at javax.servlet.http.HttpServlet.service(HttpServlet.java:717)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.core.ApplicationFilterChain.internalDoFilter(ApplicationFilterChain.java:290)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.core.ApplicationFilterChain.doFilter(ApplicationFilterChain.java:206)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.core.StandardWrapperValve.invoke(StandardWrapperValve.java:233)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.core.StandardContextValve.invoke(StandardContextValve.java:191)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.core.StandardHostValve.invoke(StandardHostValve.java:127)
INFO | jvm 15 | 2015/01/16 20:00:51 | at com.googlecode.psiprobe.Tomcat60AgentValve.invoke(Tomcat60AgentValve.java:30)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.valves.ErrorReportValve.invoke(ErrorReportValve.java:102)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.valves.AccessLogValve.invoke(AccessLogValve.java:555)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.core.StandardEngineValve.invoke(StandardEngineValve.java:109)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.catalina.connector.CoyoteAdapter.service(CoyoteAdapter.java:298)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.jk.server.JkCoyoteHandler.invoke(JkCoyoteHandler.java:190)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.jk.common.HandlerRequest.invoke(HandlerRequest.java:291)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.jk.common.ChannelSocket.invoke(ChannelSocket.java:769)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.jk.common.ChannelSocket.processConnection(ChannelSocket.java:698)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.jk.common.ChannelSocket$SocketConnection.runIt(ChannelSocket.java:891)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.apache.tomcat.util.threads.ThreadPool$ControlRunnable.run(ThreadPool.java:690)
INFO | jvm 15 | 2015/01/16 20:00:51 | at java.lang.Thread.run(Thread.java:679)
INFO | jvm 15 | 2015/01/16 20:00:51 | Caused by: org.hibernate.QueryTimeoutException: could not execute native bulk manipulation query
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.hibernate.exception.SQLStateConverter.convert(SQLStateConverter.java:124)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.hibernate.exception.JDBCExceptionHelper.convert(JDBCExceptionHelper.java:66)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:219)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.hibernate.impl.SessionImpl.executeNativeUpdate(SessionImpl.java:1310)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.hibernate.impl.SQLQueryImpl.executeUpdate(SQLQueryImpl.java:396)
INFO | jvm 15 | 2015/01/16 20:00:51 | at dba.stackexchange.com.questions.ask.MyAppRPCImpl.addLoremIpsum(Unknown Source)
INFO | jvm 15 | 2015/01/16 20:00:51 | at sun.reflect.NativeMethodAccessorImpl.invoke0(Native Method)
INFO | jvm 15 | 2015/01/16 20:00:51 | at sun.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:57)
INFO | jvm 15 | 2015/01/16 20:00:51 | at sun.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43)
INFO | jvm 15 | 2015/01/16 20:00:51 | at java.lang.reflect.Method.invoke(Method.java:616)
INFO | jvm 15 | 2015/01/16 20:00:51 | at com.google.gwt.user.server.rpc.RPC.invokeAndEncodeResponse(RPC.java:561)
INFO | jvm 15 | 2015/01/16 20:00:51 | ... 22 more
INFO | jvm 15 | 2015/01/16 20:00:51 | Caused by: java.sql.SQLException: ORA-20999: An attempt to insert lorem_ipsum.pk_id: 47396 violated DEDUPE_UNIQUE constraint with: main_id := 6459 , entity_type := FOO, another_id := 858, start_using := 04-JUL-08, stop_using :=
INFO | jvm 15 | 2015/01/16 20:00:51 | ORA-06512: at "SCOTT.MYAPP", line 504
INFO | jvm 15 | 2015/01/16 20:00:51 | ORA-06512: at "SCOTT.MYAPP", line 741
INFO | jvm 15 | 2015/01/16 20:00:51 | ORA-06512: at "SCOTT.MYAPP", line 538
INFO | jvm 15 | 2015/01/16 20:00:51 | ORA-06512: at line 1
INFO | jvm 15 | 2015/01/16 20:00:51 |
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:445)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.T4CTTIoer.processError(T4CTTIoer.java:396)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.T4C8Oall.processError(T4C8Oall.java:879)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.T4CTTIfun.receive(T4CTTIfun.java:450)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.T4CTTIfun.doRPC(T4CTTIfun.java:192)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.T4C8Oall.doOALL(T4C8Oall.java:531)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.T4CPreparedStatement.doOall8(T4CPreparedStatement.java:207)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.T4CPreparedStatement.executeForRows(T4CPreparedStatement.java:1044)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.OracleStatement.doExecuteWithTimeout(OracleStatement.java:1329)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.OraclePreparedStatement.executeInternal(OraclePreparedStatement.java:3584)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.OraclePreparedStatement.executeUpdate(OraclePreparedStatement.java:3665)
INFO | jvm 15 | 2015/01/16 20:00:51 | at oracle.jdbc.driver.OraclePreparedStatementWrapper.executeUpdate(OraclePreparedStatementWrapper.java:1352)
INFO | jvm 15 | 2015/01/16 20:00:51 | at com.mchange.v2.c3p0.impl.NewProxyPreparedStatement.executeUpdate(NewProxyPreparedStatement.java:105)
INFO | jvm 15 | 2015/01/16 20:00:51 | at org.hibernate.engine.query.NativeSQLQueryPlan.performExecuteUpdate(NativeSQLQueryPlan.java:210)
INFO | jvm 15 | 2015/01/16 20:00:51 | ... 30 more
...
最佳答案
您已经测试并确信自己(据我所知正确),您编写的内容适用于单个会话。因此,问题一定来自并发会话中的并发调用,就像您可能是从使用多个连接的多线程Web应用程序中得到的那样。
逻辑上的漏洞在于,如果从两个会话中调用该例程,则您仍然有竞争条件。一小段时间,您可以介于检查和插入之间,例如:
Session A Session B
---------------------------- ----------------------------
calls prevent_duplicates()
calls prevent_duplicates()
calls already_exists()
gets zero (false)
calls already_exists()
gets zero (false)
checks p_memory.exists()
gets false
checks p_memory.exists()
gets false
performs insert
commits
performs insert
gets constraint violation
p_memory
检查实际上并未在此处添加任何内容,因为其内容始终是特定于会话的;如果插入是在另一个会话中完成的,则您将看不到它,并且由于插入将在插入集合中时提交,因此即使是跨会话也不会告诉您任何其他信息。
already_exists
和
p_memory
检查,而只是捕获并忽略(或记录)ORA-00001。关于捕捉和忽略与插入前检查的好处还有另外的争论,这将使话题变得更加离题。
关于sql - 我的中频条件在哪里?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28003492/
我正在努力处理查询的 WHERE 部分。查询本身包含一个基于两个表中都存在的 ID 的 LEFT JOIN。但是,我要求 where 语句仅返回其中一列中存在的最大单个结果。目前我返回连接中的所有值,
我有这个代码来改变文件系统的大小。问题是,即使满足 if 条件,它也不会进入 if 条件,而我根本没有检查 if 条件。它直接进入 else 条件。 运行代码后的结果 post-install-ray
假设我有一个包含 2 列的 Excel 表格:单元格 A1 到 A10 中的日期和 B1 到 B10 中的值。 我想对五月日期的所有值求和。我有3种可能性: {=SUM((MONTH(A1:A10)=
伪代码: SELECT * FROM 'table' WHERE ('date' row.date 或 ,我们在Stack Overflow上找到一个类似的问题: https://stackove
我有下面这行代码做一个简单的查询 if ($this->fulfilled) $criteria->addCondition('fulfilled ' . (($this->fulfilled
如果在数据库中找到用户输入的键,我将尝试显示“表”中的数据。目前我已将其设置为让数据库检查 key 是否存在,如下所示: //Select all from table if a key entry
关闭。此题需要details or clarity 。目前不接受答案。 想要改进这个问题吗?通过 editing this post 添加详细信息并澄清问题. 已关闭 5 年前。 Improve th
在MYSQL中可以吗 一共有三个表 任务(task_id、task_status、...) tasks_assigned_to(ta_id、task_id、user_id) task_suggeste
我想先根据用户的状态然后根据用户名来排序我的 sql 请求。该状态由 user_type 列设置: 1=活跃,2=不活跃,3=创始人。 我会使用此请求来执行此操作,但它不起作用,因为我想在“活跃”成员
下面两个函数中最专业的代码风格是什么? 如果函数变得更复杂和更大,例如有 20 个检查怎么办? 注意:每次检查后我都需要做一些事情,所以我不能将所有内容连接到一个 if 语句中,例如: if (veh
我在 C# 项目中使用 EntityFramework 6.1.3 和 SQL Server。我有两个查询,基本上应该执行相同的操作。 1. Exams.GroupBy(x=>x.SubjectID)
我试图在 case when 语句中放入两个条件,但我在 postgresql 中遇到语法错误 case when condition 1 and condition 2 then X else Y
我正在构建一个连接多个表的查询,一个表 prodRecipe 将包含某些行的数据,但不是全部,但是 tmp_inv1 将包含所有行的计数信息。问题是,tmp_inv1.count 取决于某个项目是否在
我有一个涉及 couples of rows which have a less-than-2-hours time-difference 的查询(~0.08333 天): SELECT mt1.*,
我有一个包含许多这样的 OR 条件的代码(工作正常)来检查其中一个值是否为空,然后我们抛出一条错误消息(所有这些都必须填写) } elsif ( !$params{'account'}
我有一个名为 spGetOrders 的存储过程,它接受一些参数:@startdate 和 @enddate。这将查询“订单”表。表中的一列称为“ClosedDate”。如果订单尚未关闭,则此列将保留
在代码中,注释部分是我需要解决的问题...有没有办法在 LINQ 中编写这样的查询?我需要这个,因为我需要根据状态进行排序。 var result = ( from contact in d
我正在尝试创建一个允许省略参数的存储过程,但如果提供了参数,则进行 AND 操作: CREATE PROCEDURE MyProcedure @LastName Varchar(30)
我正在寻找一种方法来过滤我的主机文件中的新 IP 地址。我创建了一个脚本,每次我用来自矩阵企业管理器的数据调用它时都会更新我的主机文件。它工作正常。但是我必须找到一个解决方案,只允许更新 10.XX.
所以我正在做一种 slider ,当它完全向下时隐藏向下按钮,反之亦然,当向上按钮隐藏时,我遇到了问题。 var amount = $('slide').attr('number'); $('span
我是一名优秀的程序员,十分优秀!