我有一个场景需要在数据库表中插入 16k 条记录。因此,除了正常的数据库批量插入外,我还创建了 Callable 任务,它将占用相应的批处理(500 条记录的大小)并将以独立的方式进行插入。我很想知道底层数据库将如何接受这些请求。页面级别的数据库锁定是否会阻塞其余的 Java 线程,直到第一个包含 500 条记录的线程被提交?
最佳答案
我的答案是针对 Sybase ASE。对于 Sybase IQ,请参阅 Guillaume 的回答。
Does database locking at page level will block rest of java threads until first thread with batch of 500 records get committed?
这取决于您设置的锁定粒度。 According to Sybase's doc ,一共有三种锁定粒度:
- Allpages locking, which locks datapages and index pages
- Datapages locking, which locks only the data pages
- Datarows locking, which locks only the data rows
因此,如果您选择Allpages,您的线程将阻塞,直到提交当前批处理。否则,您的线程不会阻塞,但自然会产生更高的锁定开销。
有关 Sybase ASE 锁定粒度的完整详细信息,see this documentation .
关于DB写操作中的Java并发,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/34107284/