比如表Test里有两个字段name、password NAME PASSWORD ------------------------------ ------------------------------ 往里面插入一条数据insert into test values ('云天河','yuntianhe'); 然后把这条数据删去,再添加一条同样的数据,就添加不上了。 在Java里操作就是这样。而在SQL Server里就不是这样的。
具体情况说下看看,操作步骤。估计你是多session,均未commit 所以发生等待。
SQL> create table test 2 ( 3 id int, 4 name varchar2(8) 5 );表已创建。SQL> create unique index un_test_id on test (id);索引已创建。SQL> insert into test values (1,'a');已创建 1 行。SQL> commit;提交完成。SQL> delete test where id=1;已删除 1 行。SQL> commit;提交完成。SQL> insert into test values (1,'a');已创建 1 行。SQL> commit;提交完成。SQL> select * from test; ID NAME ---------- -------- 1 aSQL>
你可以在sqlplus或其他工具里开2个session第一个执行如下命令:SQL> insert into test values (1,'a');已创建 1 行。SQL> delete test where id=1;已删除 1 行。SQL> 然后开第二个,执行如下命令: SQL> insert into test values (1,'b');此时第二个session将一直等待,因为你第一个session未提交。
均commit了?
NAME PASSWORD
------------------------------ ------------------------------
往里面插入一条数据insert into test values ('云天河','yuntianhe');
然后把这条数据删去,再添加一条同样的数据,就添加不上了。
在Java里操作就是这样。而在SQL Server里就不是这样的。
所以发生等待。
2 (
3 id int,
4 name varchar2(8)
5 );表已创建。SQL> create unique index un_test_id on test (id);索引已创建。SQL> insert into test values (1,'a');已创建 1 行。SQL> commit;提交完成。SQL> delete test where id=1;已删除 1 行。SQL> commit;提交完成。SQL> insert into test values (1,'a');已创建 1 行。SQL> commit;提交完成。SQL> select * from test; ID NAME
---------- --------
1 aSQL>
然后开第二个,执行如下命令:
SQL> insert into test values (1,'b');此时第二个session将一直等待,因为你第一个session未提交。
已创建 1 行。
在pl sql中,你没提交却能看到数据变化是因为在同一个会话及事务中
你再用pl sql做试验,一样的操作,然后新开一个session查看表试试
和你用java操作是一样的道理