我有一个场景需要在数据库表中插入16k记录。因此,除了普通的DB批量插入,我创建了Callable任务,它将占用相应的批次(大小为500条记录)并将以独立方式进行插入。我很想知道底层数据库将如何处理这些请求。页面级别的数据库锁定是否会阻止其余的java线程,直到第一个包含500个记录批次的线程被提交?
答案 0 :(得分:3)
Sybase允许多个读者,但只允许一个写入表。
因此,除非您为所插入的每一行打开和关闭事务(这将很慢),否则您的线程必须等到一个事务关闭才能启动一个新事务。
答案 1 :(得分:3)
我的回答是针对Sybase ASE的。对于Sybase IQ,请参阅Guillaume的回答。
在第一个包含500个记录批次的第一个线程被提交之前,页面级别的数据库锁定是否会阻止其余的java线程?
这取决于您设置的锁定粒度。 According to Sybase's doc,有三种锁定粒度:
- Allpages锁定,用于锁定数据页和索引页
- 数据页锁定,仅锁定数据页
- 数据行锁定,仅锁定数据行
因此,如果您选择所有页面,您的线程将会阻塞,直到当前批次提交为止。否则,您的线程不会阻塞,但自然会产生更高的锁定开销。
有关Sybase ASE锁定粒度的完整详细信息,请see this documentation。