java - 关系数据库锁定

标签 java database multithreading

在求职面试中,我一直在问以下问题: 有以下情况 大约 10 个线程从队列中获取信息(作为消息对象)对其进行解析并将其传递到同一个数据库表。虽然将数据传递到数据库的过程很复杂,并且包含许多操作,包括插入、删除和更新,但整个过程是原子的,受事务打开和事务关闭操作的限制。当队列开始收到重复的消息时,数据库开始面临许多问题,例如锁、死锁、回滚等 伪代码说明:

function void doWork(Message msg){
  int msgId = msg.getId();
  Timestamp msgTime = msg.getTime();
  Data data = msg.getData();
  OpenTransaction;
     // manipulate db 
     parseIntoDB(msgId, msgTime,data);
  CloseTransaction; 
}

值得一提的是该表没有约束。我问了 2 个问题:

  1. 为什么它(锁定)只发生在重复数据上?

  2. 如何在不考虑的情况下快速解决问题 性能?

一段时间后,当我未能解释为什么会发生锁定时,她说这是由于同一行上的锁定而发生的。所以我认为我们应该在使用数据库时对函数执行一些同步,因此将同步块(synchronized block)放在 parseIntoDB 上

function void doWork(Message msg){
  int msgId = msg.getId();
  Timestamp msgTime = msg.getTime();
  Data data = msg.getData();
  OpenTransaction;
     synchronized(someObject){
        // manipulate db 
        parseIntoDB(msgId, msgTime,data);
     }
  CloseTransaction; 
}

根据她的回答,我的方向是正确的,但我仍然不知道是只锁定函数 parseIntoDB 还是锁定事务 Activity ,第二次监视应该在哪个对象上进行?

最佳答案

该问题测试理论事务隔离级别的知识以及可能的实现细节,例如 MVCC (Oracle) 与行和页锁定 (MSSQL)。

我不会在这里详细介绍,因为这是书本的主题,但我怀疑面试官想问她有关访问序列化、幂等操作、工作最小化、可伸缩性、一致性模型,可能还有乐观锁定或 A/B 死锁。

关于java - 关系数据库锁定,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28222031/

相关文章:

java - 打包时“spring.schemas”被覆盖

java - HTTP 状态 404 -/EventTracker/greeting

java - Vaadin Upload组件如何在submitUpload之前获取fileName?

sql - 使用 ssis 将表和表的一部分从一个数据库移动到另一个数据库

c# - 在 asp.net 类文件中执行 sql 命令时出现 fatal error

android - 如何在 Android 中暂停/恢复线程?

python - threading.timer 只打印 for 循环的最后一个值

java - 生成可能的 boolean 组合的最优雅的方式

php - 更新彼此链接的三个表时出现问题

c++ - 安全段错误?