Java 数据库写入操作的并发性
Java concurrency in DB write operation
我有一种情况需要在数据库中插入 16k 条记录table。因此,除了正常的数据库批量插入外,我还创建了 Callable 任务,它将占用相应的批次(500 条记录的大小)并将以独立的方式进行插入。我很想知道底层数据库将如何接受这些请求。页面级别的数据库锁定是否会阻塞 java 线程的其余部分,直到第一个包含 500 条记录的线程被提交?
Sybase allows multiple readers, but only one writer to a table.
因此,除非您为插入的每一行打开和关闭事务(这会很慢),否则您的线程将不得不等到一个事务关闭才能启动一个新事务。
我的答案是针对 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
因此,如果您 select Allpages 您的线程将阻塞,直到提交当前批处理。否则,你的线程不会阻塞,但自然会产生更高的锁定开销。
有关 Sybase ASE 锁定粒度的完整详细信息,see this documentation。
我有一种情况需要在数据库中插入 16k 条记录table。因此,除了正常的数据库批量插入外,我还创建了 Callable 任务,它将占用相应的批次(500 条记录的大小)并将以独立的方式进行插入。我很想知道底层数据库将如何接受这些请求。页面级别的数据库锁定是否会阻塞 java 线程的其余部分,直到第一个包含 500 条记录的线程被提交?
Sybase allows multiple readers, but only one writer to a table.
因此,除非您为插入的每一行打开和关闭事务(这会很慢),否则您的线程将不得不等到一个事务关闭才能启动一个新事务。
我的答案是针对 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
因此,如果您 select Allpages 您的线程将阻塞,直到提交当前批处理。否则,你的线程不会阻塞,但自然会产生更高的锁定开销。
有关 Sybase ASE 锁定粒度的完整详细信息,see this documentation。