并发环境下,向同一张表中插入多条数据

源码超级联盟 2014-11-03 12:38:51
并发环境下,向同一张表中插入多条数据(主键自增),需要锁表吗,如果锁表的话,其他的用户插入时等待多长时间会失败,还是会立即失败;如果不锁表有什么办法进行控制?请各位有这方面经验的开发人员畅所欲言,不吝赐教。
...全文
1606 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
zujinsheng 2015-01-15
  • 打赏
  • 举报
回复
这些oracle都帮你处理好了, 直接插入.. 序列就用Sequence
卖水果的net 2015-01-13
  • 打赏
  • 举报
回复
写数据时肯定会加表级锁,你可以试一下,你insert 一条记录,不要提交,你在另外一个会话中 drop 这张表,会提示资源忙。 但是你在另一个会话中,也 insert 一条记录,就不会等待,马上就可以提交。 你所有自增列(应该是 TR + SEQ实现的),也没有关系, 第一个会话,你先写 ID = 1 ,第二个会话后写了个 ID = 2 ,如果你第一个会话又 rollback 了,那么表中只有 ID = 2 的记录。 互不影响 。 这一切,都是 ORACLE 自行控制的,不会去管他。
wuxiaobo_2014 2015-01-12
  • 打赏
  • 举报
回复
我觉得是你对 数据库原理的不了解吧,100人同时写,和一个人有关系啊,至于前后,那个是oracle 控制的。
美到心痛 2015-01-12
  • 打赏
  • 举报
回复
引用 12 楼 oracle1158 的回复:
[quote=引用 10 楼 Tiger_Zhao 的回复:] 单纯做INSERT,无论哪种数据库默认应该都是锁记录的。 而且分批自增值不属于事务内容。 所以各自分配不同的ID,插入并锁记录,不存在冲突,都可以成功。 十分感谢您的回答,如果每个人向同一张表插入十条记录(每条记录的主键是自增的),同时有十个人在操作,这样会出现主键冲突的情况吗?
不知道你说的主键自增是否指主键用的序列,如果是,做为开发的你,基本上不用考虑等待的问题,只需要将sequence的cache调大一点就可以了,例如1000.
bw555 2015-01-12
  • 打赏
  • 举报
回复
ORACLE数据库生成主键一般使用序列产生,只要保证每次生成主键都是从同一个序列中读取的,就不会产生主键重复的问题
源码超级联盟 2015-01-12
  • 打赏
  • 举报
回复
[quote=引用 10 楼 Tiger_Zhao 的回复:] 单纯做INSERT,无论哪种数据库默认应该都是锁记录的。 而且分批自增值不属于事务内容。 所以各自分配不同的ID,插入并锁记录,不存在冲突,都可以成功。 十分感谢您的回答,如果每个人向同一张表插入十条记录(每条记录的主键是自增的),同时有十个人在操作,这样会出现主键冲突的情况吗?
源码超级联盟 2015-01-12
  • 打赏
  • 举报
回复
[quote=引用 10 楼 Tiger_Zhao 的回复:] 单纯做INSERT,无论哪种数据库默认应该都是锁记录的。 而且分批自增值不属于事务内容。 所以各自分配不同的ID,插入并锁记录,不存在冲突,都可以成功。 十分感谢您的回答,如果每个人插入十条记录(每条记录的主键都是自增的),同时有十个人在操作,这样会出现主键冲突的情况吗?
Tiger_Zhao 2014-11-21
  • 打赏
  • 举报
回复
单纯做INSERT,无论哪种数据库默认应该都是锁记录的。
而且分批自增值不属于事务内容。
所以各自分配不同的ID,插入并锁记录,不存在冲突,都可以成功。

这些都属于数据库的基本功能,不需要控制。
除非你一个事务中插入的记录非常多,导致记录锁升级为页锁、表锁,就会有等待,这会降低性能。
如果事务执行时间很长,导致等待超时,这时才会导致部分会话失败。
ning_wnn2014 2014-11-20
  • 打赏
  • 举报
回复
并发操作,会造成数据的不一致,而且不同数据事务的隔离级别是不同的,可以通过加锁对表进行控制,根据需要对表加适当的锁,于Oracle的锁机制,最近也在学习,共同进步。
tony4geek 2014-11-03
  • 打赏
  • 举报
回复
不同数据库事务隔离级别不一样
快乐的2 2014-11-03
  • 打赏
  • 举报
回复
你就光管插入就是了。数据库会自己控制好并发操作的。
  • 打赏
  • 举报
回复
引用 2 楼 oracle1158 的回复:
[quote=引用 1 楼 littlebrain4solving 的回复:] 每种数据库的具体情况也不一致,DB2有WITH UR读脏;也就是说如果不加WITH UR的话,会等待数据库的更新或插入。
我用的是Oracle数据库。[/quote] Oracle 不太清楚,我想应该也有这种功能吧。你到Oracle的板块问问去。
whos2002110 2014-11-03
  • 打赏
  • 举报
回复
如果只是单纯的插入,客户端的并发是受数据库本身制约的, 数据库能保证主键自增,但并发数有限。
源码超级联盟 2014-11-03
  • 打赏
  • 举报
回复
引用 1 楼 littlebrain4solving 的回复:
每种数据库的具体情况也不一致,DB2有WITH UR读脏;也就是说如果不加WITH UR的话,会等待数据库的更新或插入。
我用的是Oracle数据库。
  • 打赏
  • 举报
回复
每种数据库的具体情况也不一致,DB2有WITH UR读脏;也就是说如果不加WITH UR的话,会等待数据库的更新或插入。

17,140

社区成员

发帖
与我相关
我的任务
社区描述
Oracle开发相关技术讨论
社区管理员
  • 开发
  • Lucifer三思而后行
  • 卖水果的net
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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