0

我对具有 dep_id 和 emp_id 主键的表有一个插入语句。我的 java 程序为新记录生成一个新的 emp_id 并插入它。例如,如果我有 dep_id = 100 和 emp_id = 25,我无法插入 dep_id = 100 和 emp_id = 26 的记录,但我可以插入 dep_id = 100 和 emp_id = 27 的记录。我通过检查如果存在某种组合(dep_id = 100 和 emp_id = 26),则选择语句。没有那种东西。我仍然从 dep_id = 100 和 emp_id = 26 处删除并提交只是为了确定,然后尝试插入,但它仍然不起作用。可能有什么问题?以下是代码:修改后的 DDL 和 Insert 语句(从 Eclipse 控制台获得)

                                                                                    CREATE  TABLE "TestDB"."table1" 
 (  "dep_id" NUMBER(20,0), 
"emp_id" NUMBER(20,0), 
"STATUS" VARCHAR2(10 BYTE), 
"PRO_LEVEL" VARCHAR2(14 BYTE), 
"new_sql_stmt" VARCHAR2(4000 BYTE), 
"DEL_TEM" VARCHAR2(500 BYTE), 
"tab_name" VARCHAR2(4000 BYTE), 
"COL_NAME" VARCHAR2(4000 BYTE), 
"QUERY_TYPE" VARCHAR2(4000 BYTE), 
"NAME" VARCHAR2(4000 BYTE), 
"DT_MODIFIED" DATE DEFAULT SYSDATE

)

  CREATE UNIQUE INDEX "TestDB"."table1_PK" ON "TestDB"."table1" ("dep_id", "emp_id") 


     INSERT into table1            (dep_id,emp_id,status,new_sql_stmt,tab_name,col_name,query_type,NAME)values('100','26','Unlock','INSERT into testTab(id_some,nm_some,id_some_origin,flag,some_code,author,order) values  (''S11111111'',''trialSome00'','''',''y'','''',''100'',0)','testTab','nm_some','INSERT','trialSome00')

请注意,Insert 语句本身有另一个 Insert 语句作为值。这个插入语句(主要的)在应用程序的许多其他地方使用。另外,我使用 100 的 dep_id 是一个测试 dep_id。除了我,没有人使用它。

4

1 回答 1

1

创建一个 Oracle 序列:

CREATE SEQUENCE emp_id_seq MINVALUE 1 START WITH 1 INCREMENT BY 1; 

现在,您可以在代码中调用该序列上的“nextval”方法(这可以使用 JDBC 或几乎每个 ORM 来完成,如果不是全部的话),或者您可以在该列上放置一个触发器,自动从中获取 nextval序列并在您进行插入时将其插入表中(在 oracle 上的 IIRC,您将在触发器中使用“BEFORE INSERT”运算符)。

例如

create or replace trigger mytable_emp_id_trigger
before insert on mytable
for each row
begin
    select emp_id_seq.nextval into :emp.id from dual;
end;
/

这样做是线程安全的,你永远不会看到这样的冲突发生。

如果您坚持在 java 代码中执行此操作(假设 DBA 不会让您创建另一个序列,但是为什么 - 如果他们没有,我会感到惊讶),那么您必须使该方法线程安全. 可能最好使用同步方法创建单例(您可以创建单例 EJB)来提供下一个值。您从该单例类中获取您的 id,而不是任何其他类或 ejb 以避免像您现在遇到的问题(无论当前问题是否是因为这个,您现在遇到的是典型的多线程与非同步冲突多线程环境中的方法)。

同时,如果您真的想了解正在发生的事情,请使用您的调试器并观察您的变量以查看现有代码正在生成什么。调试器和手表是你的朋友。你的好朋友们。

于 2012-07-11T18:16:11.840 回答