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

Spring@Transactional行为调用事务性和非事务性方法

左丘宜年
2023-03-14

我正在查看一些现有的代码,并想知道在下面的场景中使用Spring的@Transactional注释会发生什么?考虑以下示例:

@ResponseBody
@Transactional
@RequestMapping(value="/send", method=RequestMethod.POST)
public void send(@RequestBody Response response) {          
    try {
        DBItem updatedDbItem = repository.updateResponse(response);
        if (updatedDbItem == null){
            //some logging
        }
    } catch(Exception ex) {         
        //some logging
    }
}
@Override
public DBItem updateResponse(Response response) {
    try {
        DBItem dBItem = findResponseById(response.getKey());            
        if (dBItem != null){
            dBItem.setSomeField(response.getValue());               
            return updateDataBaseItem(response);
        }               
    } catch (Exception ex) {
        //some logging          
    }
    return null;
}

下面的updateDataBaseItem()方法是常见的,可以从其他非事务性方法和上面的方法调用:

@Transactional
@Override
public DBItem updateDataBaseItem(Response response){
    try {           
        DBItem dBItem = em.merge(response);                     
        return dBItem;  
    } catch (Exception ex) {
        //some logging          
    }
    return null;
}

共有1个答案

缑桐
2023-03-14
  1. send()=>spring detect@transaction with default parameters实际上传播设置是必需的,并且spring加入exist事务,如果没有则创建新事务。
  2. repository.updateResponse(..)=>没有事务对同一事务中执行的方法进行参数化处理
  3. UpdateDatabaseItem(..)=>调用相同存储库中的方法时,spring将无法识别@transaction注释,因为使用了代理模式,因此该方法将在相同事务中执行

目标对象中的方法调用目标对象的另一个方法,即使调用的方法标记为@transactional,也不会在运行时导致实际的事务

 类似资料:
  • 我在想最近遇到的一个案子。假设我们有一个服务方法,如下所示: 添加用户的工作仅是因为存在。整个方法属于另一个服务,外观如下: 我不确定我是否正确理解为什么添加一个用户是有效的。根据Hibernate文档,只有当实体处于托管状态并且更新发生在单个事务中时,才会发生自动更新。如果我的推理是正确的,就会发生以下步骤: 当请求到来并命中控制器时,实体管理器(Hibernate会话)被附加到当前线程。(?)

  • 请注意: Transactional topologies 已经摒弃 -- 使用 Trident 框架替代。 Storm guarantees data processing (保证数据处理)至少一次。关于 Storm 问的最多的问题就是 "当 tuples 重发时,你会如何做呢?你会重复计算吗?" Storm 0.7.0 版本介绍了 transactional topologies.使得你可以在

  • 我创建了一个包含@Transactional注释的方面。正在按预期调用我的建议,但新实体AuditRecord从未保存到数据库中,看起来我的@Transactional注释不起作用。 bean上下文如下: 我的切入点是只拦截接口(服务接口)。服务方法可能是也可能不是事务性的。如果服务方法是事务性的,如果建议因某种原因失败,我希望该事务被回滚。 我的问题是:为什么要忽略事务注释?这是我第一次用Spr

  • 嗯,在这个问题上我可能是错的,但是我需要你的宝贵意见/建议来站在正确的道路上。 我想知道在和中处理事务管理的好的、更好的、最好的方法,以及每种方法的优缺点。 我知道的一些方案/方法也是如此: 1) 使用AOP注释的Spring事务管理(,,带有诸如,,等建议)。 问题1:我之前用SpringAOP做了一个日志示例,但我不知道如何在事务管理中做同样的事情。事务是否会在该方面类中启动、回滚和提交,并提

  • 我正在使用一个非事务性生产者,并试图理解如何处理成功/失败场景的回调。 对于一个成功的发送,我看到回调由kafka-producer-network-thread线程执行(“send ok”消息)。 发送消息成功-kafka-producer-network-thread 00:59:17.522

  • 在MongoDB中,写操作的原子性是在document级别上的,即使修改的是文档中的内嵌部分,写锁的级别也是document上。 当一个写操作要修改多个文档,每个文档的修改是原子性的。整个的写操作并不是原子性的,它可能和其他写操作产生交织。然而你可以使用$isolated隔离操作符来限制写操作,让它不与其他写操作交织。 不隔离性能更高,但是会产生数据的不确定性,隔离写操作,事务性更好。MongoD