java - @Transactional注解是否避免并发访问业务层方法

标签 java spring hibernate transactions transactional

我有点不清楚@Transactional注解在业务/服务层的用法。

我的问题是,当在业务层中与ISOLATION_SERIALIZABLE 一起使用时,@Transactional 注释是否保证不允许对特定方法进行并发访问?

@Transactional(isolation = Isolation.SERIALIZABLE)
public void businessMethod() {

    // calls subBusinessMethod
    subBusinessMethod();
    ---------------
    ---------------
    ---------------

}

假设 subBusinessMethod 调用 DAO 层来执行一些数据库事务。调用 subBusinessMethod 后的代码执行(可能有更多的数据库调用)取决于 subBusinessMethod 中发生的数据库事务的结果。

我需要确保对 businessMethod 的后续调用不应调用 dao 层来读取/写入数据库,而不知道先前调用的 db 表发生了什么。业务逻辑中添加了必需的验证。

首先,我的方法是否有效?如果是这样,我是否以正确的方式使用它。 ?

最佳答案

没有。 @Transactional 属性直接向下映射到数据库级别。该方法可以并且将被并发访问(只有 synchronized 或其他锁定可以防止这种情况)。

另一方面,底层数据库事务将以可序列化隔离的方式执行,即事务的最终结果必须就像每个事务一个接一个地运行一样(即使它们实际上并不是一个接一个地运行)。

根据您的要求,这似乎是一种可行的方法。但它可能不是唯一的,甚至不是最好的。

关于java - @Transactional注解是否避免并发访问业务层方法,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48297428/

相关文章:

java - 在没有映射表的情况下存储 JSP HashMap?

java - 无法创建事务异常 : Could not open Hibernate Session for transaction(Hibernate, MySQL、MVC)

Spring 框架 - 注入(inject) bean 子集

java - 不希望使用 Hibernate Projection 进行 N+1 查询

运行 jdk1.8.0 的 ARM 上的 JavaFX

java - red5中的多线程

java - 使用 PDFBox 将 unicode 字符串写入 PDF

java - 在 java @configuration 类中初始化 init 方法属性的更好方法

java - Open Session In View (OSIV) 和 Hibernate Session flush

java - 如何使用 Jinq 搜索 Set