【发布时间】:2017-07-31 04:58:35
【问题描述】:
让我们想象一个环境:有一个数据库客户端和一个数据库服务器。 db客户端可以是Java程序或其他等; db服务器可以是mysql、oracle等。
需求是在数据库服务器的一张表中插入大量记录。
最简单的方法是有一个循环,客户端每次在其中插入一条记录,直到插入所有记录。这是单线程顺序插入。
还有另一种多线程并发插入方式,让客户端同时启动多个线程,每个线程将一条记录插入表中。直观地说,因为这些记录是独立的,并且假设现代数据库服务器带有 RAID,其中并发 IO 得到很好的支持,它们似乎能够为多个插入获得实际和真正的并发,因此,这种方式可以改善性能,与上述方法相比。
但是,当我深入了解更多细节时,发现情况可能并非如此。这个链接——Multi threaded insert using ORM? 说在同一张表上的插入需要对整个表上的每一次写入都加锁。因此,每次插入只会阻塞另一个后续插入,最终,这种方式只是另一种顺序多次插入,根本没有性能提升。
我的问题如下:
- 为什么大多数 DB 都这样对待同一张表上的多线程插入?
- 为什么对整个表强制插入锁?
- 多线程更新是否被视为多线程插入?
尽管处理大量插入的最佳方法似乎是启用批量插入,但我仍然很好奇在插入发生时锁定整个表的理由。
提前致谢!
================================================ =======================
经过大量阅读和研究,这表明我的问题实际上是错误的。真正的事情是一个插入不会同时阻塞另一个插入。(至少对于 Oracle 来说是这样)。
【问题讨论】:
-
这个问题的前提是错误的,因为链接问题中接受的答案是错误的。该线程中未接受的答案更准确。
-
您好 Jon,感谢您的意见,这很有帮助。您是在线程中说的——stackoverflow.com/questions/6602399/…,答案是——数据库上的多线程插入语句不会真正让它执行得更快,因为在大多数数据库中,表需要锁定才能插入。 错了吗?
-
另外你能指出哪个答案更准确吗?非常感谢。
-
是的,这个答案是错误的。也许对于那个特定的数据库是正确的,但答案不适用于“大多数”数据库。
-
@Jon Heller 感谢您的跟进。
标签: java mysql multithreading oracle locking