在线交易中同步的工作方式

时间:2018-08-17 01:04:40

标签: java multithreading concurrency synchronized thread-synchronization

我正在阅读有关Java同步的内容,并有一些疑问。我了解多个线程访问同一对象时会导致数据不一致。 作为解决方案,拥有对象锁的线程将执行

我在许多教程中看到的一个例子是网上银行。丈夫和妻子同时从同一个银行帐户中花费300美元。但是帐户余额只有500美元,因此一个人的交易将失败。

我的问题:当夫妻俩尝试在2台不同的笔记本电脑上进行交易时,每个请求都会创建一个单独的线程,并且每个线程都会从数据库中创建一个单独的银行帐户对象(2个线程和2个bankaccount对象)。在这种情况下如何实现同步?

预先感谢

2 个答案:

答案 0 :(得分:1)

概述

在这种情况下,具有 N BankAccount对象的

N个应该无关紧要。在某些情况下,需要大量处理此实现,因此我将逐步介绍每个实现并解释该过程。

单服务器应用程序

设计将由客户端(笔记本电脑上的本地应用程序)和服务器(处理请求的远程应用程序)组成。具有多个 Client 应用程序不会导致多个 Server 应用程序,因此允许在 Server 上处理同步。这样,可以按照 Server 认为合适的方式创建,维护和执行传入请求的FIFO队列。

在上述您的家庭示例中,第一个到达的请求将被首先处理并收到成功通知。另一个将被拒绝并收到失败通知。

多服务器应用程序

这是通过Load Balancing处理的。幸运的是,有一些针对Java的实现。这将抽象出多个服务器,使其看起来像单个服务器,并且行为与单服务器应用程序相同。有关此问题的更多信息,请参见this thread

数据库

数据库(DB)应该实现乐观或悲观。尽管Pessimistic具有更高的完整性,但它需要仔细的设计,稳定的数据库连接和/或代替数据库连接的事务ID实现。乐观可用于大量且无需会话的应用程序,但是在银行业务场景中,悲观可能是更好的选择。

答案 1 :(得分:0)

您需要在数据库上使用悲观锁定。谷歌它的更多细节。简而言之,如果未对原始对象进行任何更改,则仅继续执行第二个请求。

1. First request received
2. Second request received
3. First request loads object from db into accountobject
4. Second request loads the same object from db into accountobject
5. Both request manipulate the object (-300)
6. First request saves object but it checks if no modifications were done, 
   in sql code it may look like: 
       update account set amount = 200 where id = 123 and amount = 500
7. Second request tries to save an account and executes the same query.
   As filter requirement is not fulfilled(amount /= 500) the command isn't executed