如何避免oralce insert时等待问题

boy002 2007-01-09 11:37:25
有一个table,其中有一个栏位叫item其为primary key,有其他user对其进行
insert一个值(A),但没有commit,此时我对其进行insert值(A),如何使我
直接跳过而不必等待其他user完成teansaction后执行
...全文
337 7 打赏 收藏 转发到动态 举报
写回复
用AI写文章
7 条回复
切换为时间正序
请发表友善的回复…
发表回复
tgm78 2007-01-11
  • 打赏
  • 举报
回复
看来楼主属于“你有一个带主键的表,或者表上有唯一的约束,但两个会话试图用同样的值插入一行。如果这样,其中的一个会话就会阻塞,直到另一个会话提交或者回滚为止:如果另一个会话提交,则阻塞的会话会收到一个错误,指出存在一个重复值;倘若另一个会话会滚,则阻塞的会话会成功。”情况
boy002 2007-01-11
  • 打赏
  • 举报
回复
谢谢大家的关注,特别是wiler(@_@),我已经找到解决方法,利用rdbms_lock解决.
tgm78 2007-01-09
  • 打赏
  • 举报
回复
oracle数据库是要保证一致性读取的。
别的session没有commit的话,是不会写入数据文件的,在内存中。

所以,你的session是否commit和别的session是否commit无关
sten 2007-01-09
  • 打赏
  • 举报
回复
marking
wiler 2007-01-09
  • 打赏
  • 举报
回复
insert 语句是没有nowait的
对不起
转摘:
阻塞的insert
insert的阻塞不多见。最常见的情况是,你有一个带主键的表,或者表上有唯一的约束,但两个会话试图用同样的值插入一行。如果这样,其中的一个会话就会阻塞,直到另一个会话提交或者回滚为止:如果另一个会话提交,则阻塞的会话会收到一个错误,指出存在一个重复值;倘若另一个会话会滚,则阻塞的会话会成功。还有一种情况,可能多个表通过引用完整性约束相互链接。对子表的插入可能会阻塞,因为它所依赖的父表正在创建或删除。

如果允许最终用生成主键/唯一列值,就有可能发生insert阻塞。为避免这种情况,最容易的做法是使用一个序列来生成主键/唯一列值。

如果无法使用序列,可以使用手工锁来避免这个问题,这里的手工锁通过内置的DBMS_LOCK包来实现
tgm78 2007-01-09
  • 打赏
  • 举报
回复
不需要等待直接报错,可以加上nowait。
wiler 2007-01-09
  • 打赏
  • 举报
回复
加 nowait

3,491

社区成员

发帖
与我相关
我的任务
社区描述
Oracle 高级技术相关讨论专区
社区管理员
  • 高级技术社区
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

试试用AI创作助手写篇文章吧