gpt4 book ai didi

java - 同步和@Transactional 让我困惑

转载 作者:行者123 更新时间:2023-12-01 18:14:53 25 4
gpt4 key购买 nike

我读到了有关 spring 中事务管理的内容,在我们的服务方法或服务类上使用 @Transactional 注释,并使用其传播、隔离、超时、只读属性配置我们的事务。现在我的问题是:

1)如果我们适本地使用@Transactional来实现ACID属性,我们还需要使用同步(使用synchronized关键字)或多线程吗?

2) 在我们的 Java EE Web 应用程序中仍然使用 java 多线程可能有哪些不同的场景?

3)如果需要多线程,我们的应用程序的哪一层应该使用同步方法或 block 以及可能的原因是什么?

我正在 github 中找到的一个虚拟在线银行项目的帮助下学习。因此,如果答案与此场景相关,那就太好了。这是我的类(class)(只是为了给您一个想法):

//Here are some entity classes

@实体公共(public)类用户{...}

@实体公共(public)类帐户{...}

@实体公开课卡{...}

@实体公共(public)类操作{...}

// now some DAO examples

公共(public)类OperationDaoImpl实现OperationDao{

Page findNonCardByAccountIdAndYearMonth(Integer accountId, YearMonthyearMonth, Pageable pageable){...}

Page findTransferByAccountId(Integer accountId, Pageable 可分页){...} DateTime getLastOperationDate(){...}

}

// now some service examples

@服务

@Transactional(readOnly = true)

@验证

公共(public)类 BankServiceImpl 实现 BankService {

公共(public) map sumResolvedCardOperationsByAccountIdAndYearMonth(Integer accountId, YearMonthyearMonth) {...}

@Transactional(readOnly = false)

public void PerformTransfer(Integer debitedAccountId, IntegercreditedAccountId, @Min(10) BigDecimal amount) 抛出 UnsufficientBalanceException {...}

}

//还有 spring-mvc Controller 。

伙计们!抱歉问了这么长的问题。欢迎任何建议。谢谢。

最佳答案

Web 应用程序本质上是多线程的,您无需启动线程:每次请求到达 Web 服务器时,Web 服务器都会使用一个线程来处理该请求。如果在第一个请求仍在处理时出现第二个请求,则会使用另一个线程来处理第二个请求,同时处理第一个请求。因此容器会为您处理多线程。

所以是的,您的 BankService 将被多个线程同时使用。这是否意味着您需要使用同步?一点都不。 Spring 服务通常是无状态的,因此线程之间不会共享任何状态,这意味着不需要同步。多个线程共享的唯一状态是数据库本身。这就是事务必要的地方:它们确保虽然数据库将同时处理多个查询和更新,但每个事务都将独立于其他事务运行,并且提交后数据库的状态将保持一致。

请注意,每个事务都有自己的 JPA 持久性上下文,其中包含自己的 JPA 实体实例。因此,即使 JPA 实体确实具有内存中状态,它们也不会在线程之间共享,因此也不需要同步。

另请注意,正如您所说,同步并不是为了获得更好的性能而使用的。同步用于确保正确性。

关于java - 同步和@Transactional 让我困惑,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/30279946/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com