Java 当应用程序在多个节点上运行时,如何在数据库更新中实现同步?

Java 当应用程序在多个节点上运行时,如何在数据库更新中实现同步?,java,database,multithreading,synchronization,high-availability,Java,Database,Multithreading,Synchronization,High Availability,我是J2EE开发新手,正在尝试正确掌握一些基础知识。所以问题是,假设我在数据库的某个地方有一个employee表和一个增加employee表中salary列的函数 public synchronized IncreaseSalaryResponse increaseSalary(int empId, long raise); 在我的例子中,服务运行在两个节点上(因此是两个JVM),以实现高可用性。现在,如果同时发出两个电话来增加一名员工的工资,并且如果他们碰到不同的主机,那么最后发出的函数调用

我是J2EE开发新手,正在尝试正确掌握一些基础知识。所以问题是,假设我在数据库的某个地方有一个
employee
表和一个增加
employee
表中
salary
列的函数

public synchronized IncreaseSalaryResponse increaseSalary(int empId, long raise);
在我的例子中,服务运行在两个节点上(因此是两个JVM),以实现高可用性。现在,如果同时发出两个电话来增加一名员工的工资,并且如果他们碰到不同的主机,那么最后发出的函数调用将在最终工资中反映其效果

DB是否确保在其级别避免此类竞争条件

如果没有,我如何处理这种情况


请提供想法。

这取决于您使用的RDM是否是跨国的以及隔离级别

根据维基百科

数据库环境中的事务有两个主要用途:

1-提供可靠的工作单元,允许从 即使在系统发生故障的情况下,也要保持数据库的一致性 当执行停止(完全或部分)且许多 对数据库的操作尚未完成,状态不清楚

2-在同时访问数据库的程序之间提供隔离。 如果不提供这种隔离,程序的结果可能是 错误的


我认为这不能在应用程序级别处理。您可以通过“update emp set salary=salary+increment where…”而不是“update emp set salary=newsalary where…”的方式进行更新查询。。这样,当两个进程试图增加薪资时,新值将为基本薪资+增量1+增量2。此外,当第一个流程使用薪资值更新表时,除非第一个流程提交更改,否则该行将不可用于任何其他流程进行更新。数据库通过锁定更改的行来处理并发性。但如果两个查询同时读取当前薪资并在其上添加增量,从而导致最终薪资
currentSalary+raise1
currentSalary+raise2
。您没有提到正在使用的数据库。Oracle不允许两个进程同时更新一行。您可以打开数据库的两个会话,并尝试更新两个会话中的同一行。您可以看到,第二个会话将挂起并等待第一个会话提交更改。对于Oracle,您使用
update emp set salary=salary+increment的第一个参数不再有效。即使我更新emp set salary=newsalary,第二个会话将挂起。这样就避免了竞争条件。如果是这种情况,那么我的问题
DB是否确保在其级别上避免此类争用条件?
应该回答为
。Oracle处理争用条件的方法是根据超时值暂停第二次尝试(如果更新行的第一个进程尚未提交)您的流程可以捕获这些信息,并采取必要的步骤。那么,作为一名开发人员,我应该关注的领域是什么。是否只是确保在更新共享资源(例如数据库表)时使用应用程序级锁。rest由DB负责吗?我也知道,事务性只意味着事务将被提交或完全回滚。隔离对我的目的有帮助。但是在选择支持隔离的数据库时,我是否可以确保不会出现竞争条件?您需要确保您使用的数据库支持事务(默认情况下,所有modern*RDBM都支持事务)。您需要确保选择了适当的隔离级别。例如,在JDBC中,可以为在特定连接上发出的所有事务设置隔离级别。本文将更详细地解释此主题。如果选择适当的隔离级别,则假定您的应用程序正确设计为多线程访问(即使用同步),则不会出现争用条件。