【问题标题】:Java concurrency in DB write operationDB写操作中的Java并发
【发布时间】:2016-03-10 12:05:56
【问题描述】:

我遇到了一种情况,我需要在数据库表中插入 16k 条记录。因此,与正常的数据库批量插入一起,我创建了 Callable 任务,该任务将占用相应的批次(500 条记录的大小),并将以独立的方式进行插入。我很想知道底层数据库将如何接受这些请求。页面级别的数据库锁定是否会阻塞其余的 java 线程,直到第一个具有 500 条记录的线程被提交?

【问题讨论】:

  • 你用的是什么数据库?
  • @Zim-ZamO'Pootertoot sybase

标签: java database multithreading jdbc sybase


【解决方案1】:

来自Sybase IQ's documentation

Sybase 允许多个读取器,但一个表只能有一个写入器。

因此,除非您为插入的每一行打开和关闭事务(这会很慢),否则您的线程将不得不等到一个事务关闭才能开始新的事务。

【讨论】:

【解决方案2】:

我的答案是针对 Sybase ASE。对于 Sybase IQ,请参阅 Guillaume 的回答。

页面级别的数据库锁定是否会阻塞其余的 java 线程,直到第一个有 500 条记录的线程被提交?

这取决于您设置的锁定粒度。 According to Sybase's doc,有三种锁定粒度:

  • 所有页锁定,用于锁定数据页和索引页
  • 数据页锁定,仅锁定数据页
  • 数据行锁定,仅锁定数据行

因此,如果您选择 Allpages,您的线程将被阻塞,直到当前批次被提交。否则,您的线程不会阻塞,但自然会产生更高的锁定开销。

有关 Sybase ASE 锁定粒度的完整详细信息,see this documentation

【讨论】:

    猜你喜欢
    • 2014-03-26
    • 1970-01-01
    • 2019-07-25
    • 1970-01-01
    • 1970-01-01
    • 2021-07-11
    • 2020-06-19
    • 2011-06-01
    • 2018-09-11
    相关资源
    最近更新 更多