当前位置: 首页 > 知识库问答 >
问题:

同步和@Transactional让我困惑

薛博艺
2023-03-14

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

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

2)在我们的java EE Web应用程序中仍然使用java多线程的不同场景是什么?

//Here are some entity classes

@实体pulic类帐户{...}

@实体公共类卡{...}

@实体公共类操作{...}

// now some DAO examples

公共类OperationDaoImpl实现OperationDao{

页面findNonCardByAccountIdAndYearMonth(整数accountId,yearmontyyearmont,Pageable Pageable){...}

// now some service examples

@服务

@transactional(readOnly=true)

@已验证

共有1个答案

钱跃
2023-03-14

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

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

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

 类似资料:
  • 下面是下一个gc日志(第一行是我执行的时间减去应用程序停止工作的时间)。 在时,该应用程序再次停止工作。 然后我再次使用命令,应用程序再次返回ok。 下面是结果文件中的一个特殊线程。除了in_vm之外,所有线程的状态都被阻塞。 这里是我的环境。

  • 问题内容: 我正在做非常简单的int除法,而结果却很奇怪。 此代码按预期方式打印: 此代码打印为 不 期望: 这里发生了什么? (Windows XP Pro,Java 1.6在Eclipse 3.4.1中运行) 问题答案: 该值是一个 八进制 (以8 为底)常数。等于128(十进制)。 从Java语言规范的第3.10.1节开始: 八进制数字由一个ASCII数字0和一个或多个ASCII数字0至7组

  • 问题内容: 我有一种将用于发送电子邮件的方法。我想锁定此方法,以便每次只有一个线程可以访问它,其余线程同时存储。我应该同步方法还是使用spring @transactional PROPAGATION_REQUIRED? 在我的服务层 问题答案: 为什么不通过不使用任何实例级别的东西使该方法成为线程安全的呢? 但是,我看不到Spring的事务管理如何适合这里。我的意思是Spring提供几个事务管理

  • 我不知道如何同时有元音和辅音。代码的元音部分工作正常。我不知道如何添加辅音。 我似乎无法理解代码的辅音部分

  • 解决了它,但仍然不明白ListNode的这些基本部分(问题说明附后): 1.“1->2->3->3->4->5->3”是Java中ListNode的标准表达式吗?removeElements中的参数是“head”,它看起来像一个节点,它怎么可能输入一个ListNode,还是一个“嵌套的”ListNode? 2.“removeElements”函数“return”“dummy.next”,它的类型与

  • 问题内容: 我有 我的问题是:mySetup,testMy和myTeardown是否都将在同一事务中运行?似乎他们应该这样做,但是我遇到了一个奇怪的错误,这可能表明他们正在互相踩踏。 问题答案: 是的,这三种方法将在同一事务中运行。请参阅参考文档中的TestContext Framework /事务管理 部分: 在 事务 内 执行任何before方法(例如,用JUnit的@Before注释的方法)