首页
学习
活动
专区
工具
TVP
发布
精选内容/技术社群/优惠产品,尽在小程序
立即前往

是否可以在调用返回结果集但也更新行的存储过程的方法上使用@Transactional(readOnly = true)?

在调用返回结果集但也更新行的存储过程的方法上使用@Transactional(readOnly = true)是不合适的。

@Transactional(readOnly = true)注解表示当前方法只读,不会对数据库进行任何修改操作。而调用返回结果集但也更新行的存储过程的方法通常会对数据库进行更新操作,因此不适合使用@Transactional(readOnly = true)注解。

正确的做法是在调用存储过程的方法上使用@Transactional注解,不指定readOnly属性,表示该方法既可以读取结果集,也可以更新行。示例代码如下:

代码语言:txt
复制
@Transactional
public void callStoredProcedure() {
    // 调用存储过程的代码
}

在调用存储过程的方法上使用@Transactional注解可以保证方法执行过程中的事务一致性,即要么全部执行成功,要么全部回滚。如果需要在存储过程执行过程中进行读写分离,可以根据具体情况在方法内部使用@Transactional(readOnly = true)注解来控制读写权限。

需要注意的是,具体的实现方式可能会因不同的云计算平台而有所差异,可以根据实际情况选择适合的云计算平台和相关产品来支持存储过程的调用和事务管理。

页面内容是否对你有帮助?
有帮助
没帮助

相关·内容

Spring的声明式事务管理

) 在整个方法运行前就不会开启事务        还可以加上:@Transactional(propagation=Propagation.NOT_SUPPORTED,readOnly=true),...更常见的情况是,我们使用更新的对象关系映射(ORM)框架来减轻工作,即用几个简单的方法调用替换所有麻烦的 JDBC 代码。...按照上面的测试,如果在结合使用 JPA 和 Hibernate 时调用 insertTrade() 方法,清单 7 中的 @Transactional 注释会得到什么结果? 清单 7....注意,清单 11 中的两个方法都是公共方法,这意味着它们可以单独调用。当使用 REQUIRES_NEW 属性的几个方法通过服务间通信或编排在同一逻辑工作单元内调用时,该属性就会出现问题。...例如,假设在清单 11 中,您可以独立于一些用例中的任何其他方法来调用 updateAcct() 方法,但也有在 insertTrade() 方法中调用 updateAcct() 方法的情况。

97050

Spring @Transactional事务管理

默认为 Isolation.DEFAULT 脏读 : 一个事务读取到另一事务未提交的更新数据 不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据...同一个类中,非@Transactional方法调用@Transactional方法 还是动态代理的原因,类内部方法的调用是通过this调用的,不会使用动态代理对象,事务不会回滚。...当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。...虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。...默认情况下,只有 来自外部的方法调用 才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰。

42210
  • Spring认证中国教育管理中心-Spring Data JPA 参考文档六

    存储过程 JPA 2.1 规范引入了对使用 JPA 条件查询 API 调用存储过程的支持。我们引入了@Procedure用于在存储库方法上声明存储过程元数据的注释。...name是 JPA 使用的名称。procedureName是存储过程在数据库中的名称。 您可以通过多种方式从存储库方法中引用存储过程。...,则该参数可以作为方法的返回值返回。...下表显示了StringMatcher您可以使用的各种选项以及在名为 的字段上使用它们的结果firstname: 5.1.7....事务查询方法 要让您的查询方法具有事务性,请@Transactional在您定义的存储库接口处使用,如以下示例所示: 示例 109.在查询方法中使用 @Transactional @Transactional

    1.3K20

    @Transactional事务注解及请求接口的定义先后执行顺序设计

    3.在方法内执行调用第三方的推送,比如先推送取消,后推送新增。必须取消成功之后,才可以推送新增。可以将该方法定义一个异步方法。@Async 异步方法的优势是不影响当前主流程的执行。...所以Oracle不支持脏读 脏读 : 一个事务读取到另一事务未提交的更新数据 不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据...注解中常用参数说明 1、readOnly @Transactional(readOnly=true)//该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false...2、@Transactional 注解可以被应用于接口定义和接口方法、类定义和类的 public 方法上。...3、Spring团队的建议是你在具体的类(或类的方法)上使用 @Transactional 注解,而不要使用在类所要实现的任何接口上。

    12210

    @Transactional(readOnly=true) 可能带来隐藏的性能陷阱

    先思考以下几点: @Transactional(readOnly = true)是如何工作的,为什么使用它可以提高性能?...当我们使用 JPA 时,是否应该总是将@Transactional(readOnly = true)添加到服务层的只读方法?有什么取舍吗? 在开始之前,我们使用 Hibernate 来实现 JPA。...总而言之,这些是在 Hibernate 中使用@Transactional(readOnly = true)所得到的结果 性能改进:只读实体不进行脏检查 节省内存:不维护持久状态的快照 数据一致性:只读实体的更改不会持久化...但是,将@Transactional(readOnly = true)添加到服务层的只读方法是否合适?以下是我担心的事情 无限制地使用事务可能会导致数据库死锁、性能和吞吐量下降。...当您需要将只读查询仅仅作为一个事务执行时,请毫不犹豫选择的在服务层的方法中使用@Transactional(readOnly = true),如果你的服务层的方法中有大量其他逻辑方法时,就要做取舍了!

    3900

    @Transactional(readOnly=true) 真的是提高性能的灵丹妙药吗?

    先思考以下几点: @Transactional(readOnly = true)是如何工作的,为什么使用它可以提高性能?...当我们使用 JPA 时,是否应该总是将@Transactional(readOnly = true)添加到服务层的只读方法?有什么取舍吗? 在开始之前,我们使用 Hibernate 来实现 JPA。...总而言之,这些是在 Hibernate 中使用@Transactional(readOnly = true)所得到的结果 性能改进:只读实体不进行脏检查 节省内存:不维护持久状态的快照 数据一致性:只读实体的更改不会持久化...但是,将@Transactional(readOnly = true)添加到服务层的只读方法是否合适?以下是我担心的事情 无限制地使用事务可能会导致数据库死锁、性能和吞吐量下降。...当您需要将只读查询仅仅作为一个事务执行时,请毫不犹豫选择的在服务层的方法中使用@Transactional(readOnly = true),如果你的服务层的方法中有大量其他逻辑方法时,就要做取舍了!

    96430

    Spring JPA 自定义删改

    Spring JPA 更新创建 ​ 之前介绍的方法,基本都是只读方法,查询创建没有对数据库中存储的实体进行任何修改,但是对于更新和删除来说,如果继续保持只读属性,那么改删功能是难以完成的。...在执行了修改的查询之后可能返回之前的查询结果,如果您希望EntityManager被自动清除,您可以将@ modify注释的clearautomatic属性设置为true。...为了确保实际调用生命周期查询,deleteByRoleId()的调用执行一个查询,然后逐个删除返回的实例,这样持久性提供者就可以对这些实体实际调用@PreRemove回调。 ​...这是因为,默认情况下,repository 接口中的CRUD方法都是被@Transactional注解修饰了的,对于读的操作方法,@Transactional注解的readOnly属性是被设置为true...如果你需要修改repository 接口中的某些方法的事务属性,可以在该方法上重新加上@Transactional注解,并设置需要的属性。

    1.4K20

    @Transactional注解详解

    @Transactional注解可以作用于接口、接口方法、类以及类方法上 1. 当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性 2....当在 protected、private 或者默认可见性的方法上使用 @Transactional 注解时是不会生效的,也不会抛出任何异常 5....默认情况下,只有来自外部的方法调用才会被AOP代理捕获,也就是,类内部方法调用本类内部的其他方法并不会引起事务行为,即使被调用方法使用@Transactional注解进行修饰 @Transactional...注解的可用参数 readOnly 该属性用于设置当前事务是否为只读事务,设置为true表示只读,false则表示可读写,默认值为false rollbackFor 该属性用于设置需要进行回滚的异常类数组...脏读 : 一个事务读取到另一事务未提交的更新数据 不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说, 后续读取可以读到另一事务已提交的更新数据.

    11.8K52

    Transactional 可以作用于接口、接口方法、类以及类方法上

    "/> 此时在DAO上需加上@Transactional注解,如下: /** * 1.添加事务注解 * 使用propagation 指定事务的传播行为,即当前的事务方法被另外一个事务方法调用时如何使用事务...* 3.默认情况下 Spring 的声明式事务对所有的运行时异常进行回滚,也可以通过对应的属性进行设置。通常情况下,默认值即可。 * 4.使用readOnly 指定事务是否为只读。...若真的是一个只读取数据库值得方法,应设置readOnly=true * 5.使用timeOut 指定强制回滚之前事务可以占用的时间。...当作用于类上时,该类的所有 public 方法将都具有该类型的事务属性,同时,我们也可以在方法级别使用该标注来覆盖类级别的定义。   ...虽然 @Transactional 注解可以作用于接口、接口方法、类以及类方法上,但是 Spring 建议不要在接口或者接口方法上使用该注解,因为这只有在使用基于接口的代理时它才会生效。

    1.9K00

    spring之事务的其它属性(隔离级别、回滚、只读、过期)(四)

    1.使用 propagation 指定事务的传播行为, 即当前的事务方法被另外一个事务方法调用时如何使用事务, 默认取值为 REQUIRED, 即使用调用方法的事务REQUIRES_NEW: 事务自己的事务..., 调用的事务方法的事务被挂起。...也可以通过对应的属性进行设置. 通常情况下取默认值即可. 。 4.使用 readOnly 指定事务是否为只读. 表示这个事务只读取数据但不更新数据, 这样可以帮助数据库引擎优化事务....若真的是一个只读取数据库值的方法, 应设置 readOnly=true。 5.使用 timeout 指定强制回滚之前事务可以占用的时间。...设置timeout指定强制回滚的时间。我们在purchase里面加上休眠,此时休眠2s<3s。 并将数据库中数据重新设置为: ? ? 此时我们测试testBookShopService,结果为: ?

    70730

    Spring之事务

    即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态 二、基于注解的声明式事务 1、@Transactional注解标识的位置 @Transactional标识在方法上,则只会影响该方法...默认false,可以查询,可以增删改,设置为true,只能查询 使用方式: @Transactional(readOnly = true) public void buyBook(Integer bookId...(serializable) 确保Transaction01可以多次从一个表中读取到相同的行,在Transaction01执行期间,禁止其它事务对这个表进行添加、更新、删除操作 可以避免任何并发问题...在service1类和service2类中分别有a()方法和b()方法,两个方法都是事务 当a()方法执行过程中调用了b()方法,事务是如何传递的? 合并到一个事务里?还是开启一个新的事务?...,都要开启新事务 加在buybook()上,每次调用这个方法,都开起一个新事务,每次调用都不相关 每次购买图书都是在buyBook()的事务中执行,因此第一本图书购买成功,事务结束,第二本图书购买失败,

    8810

    SpringBoot 系列教程之事务隔离级别知识点小结

    SpringBoot 系列教程之事务隔离级别知识点小结 上一篇博文介绍了声明式事务@Transactional的简单使用姿势,最文章的最后给出了这个注解的多个属性,本文将着重放在事务隔离级别的知识点上...:查询 id 在[1,10]之间的记录,第一次返回了 1,2,3 三条记录;但是另外一个事务新增了一个 id 为 4 的记录,导致再次查询时,返回了 1,2,3,4 四条记录,第二次查询时多了一条记录,...为 true,则事务为只读)多次读取相同的数据,我们希望在事务二的第一次读取中,能获取到事务一的中间修改结果(所以请注意两个方法中的 sleep 使用) @Transactional(readOnly...RC 事务隔离级别 rc 隔离级别,可以解决脏读,但是不可重复读问题无法避免,所以我们需要设计一个 case,看一下是否可以读取另外一个事务提交后的结果 在前面的测试 case 上,稍微改一改 // -...--------- rc 事物隔离级别 // 测试不可重复读,一个事务内,两次读取的结果不一样 @Transactional(readOnly = true, isolation = Isolation.READ_COMMITTED

    2K30

    客户端存储

    应用启动的时候,检查 URL 并实例化对应的 store。 为了保持 API 的一致性,所有的方法都是异步的,即它们将结果返回给调用方。...这样,成功回调函数就是我们传给搜索函数的句柄——确保句柄在成功的时候被调用,以便操作完成之后 UI 能接到通知(比如,更新目前为止的签到数量)。...但我们仍需要手动遍历来累计签到数据,因为数据库 API 返回的是数据库行,而不是一个数组。(对大的结果集来说这是好事,但就现在而言这增加了我们需要的工作!)...),看结果集的长度。...但如果我们知道我们在 SQL 中,有更容易和更快的方式 —— 我们可以执行一个特殊的 select 语句来检索计数。它将返回一行,其中一列包含计数。

    1.9K20

    Spring,SpringCloud全面解析

    调用doGetBean方法,想要获取beanA,于是调用getSingleton方法从缓存中查找beanA 在getSingletion方法中,从一级缓存中查找,返回null doGetBean方法中获取到的...,是否允许提前暴露引用,是否正在创建中,判断为true则将beanA添加到三级缓存中 对beanA属性填充,此时检测到beanA依赖beanB,于是开始查找beanB 调用doGetbean方法,和上面检测到..."); return "衣服"; } } 我们要在Boy和Girl在调用Buy之前添加打印一些其他语句,此时我们就可以使用AOP.我们把IBuy中的buy叫做切点,而我们要实现添加打印其他语句的处理就叫做通知...,这个里面引用你真正使用的类,所有的方法调用,都是走代理类的对象,他负责在代码上做一些增强,在去调用你的类 而spring aop 中,比如你对一批类和他们的方法进行做了一个切面,定义好要在这些类的方法增强代码...,他其实是在你的类在有接口的时候使用 但是很多时候,我们的类并没有实现接口,因此我们就要用到了CGLIB生成代理对象,他是生成类的一个子类,他可以动态生成字节码,覆盖你的方法,在方法中加入增强的代码 JDK

    43720

    程序员新人周一优化一行代码,周三被劝退?

    声明式事务虽然优于编程式事务,但也有不足,声明式事务管理的粒度是方法级别,而编程式事务是可以精确到代码块级别的。...返回类型 TransactionStatus 主要用来存储当前事务的一些状态和数据,比如说事务资源(connection)、回滚状态等。...事务传播行为 当事务方法被另外一个事务方法调用时,必须指定事务应该如何传播,例如,方法可能继续在当前事务中执行,也可以开启一个新的事务,在自己的事务中执行。...@Transactional 的作用范围 类上,表明类中所有 public 方法都启用事务 方法上,最常用的一种 接口上,不推荐使用 @Transactional 的常用配置参数 虽然 @Transactional...@Transactional 的使用注意事项总结 1)要在 public 方法上使用,在AbstractFallbackTransactionAttributeSource类的computeTransactionAttribute

    30330

    Spring之AOP

    ):在业务方法执行之前和之后执行,即是在@Before之前执行,在@After之后执行,必须又返回值,这里的返回值就是业务层方法的返回值,如果不返回,那么业务层方法就获取不到返回值 连接点 业务层的所有方法...:第一个*表示方法的返回类型,一般使用*表示,其中的形式是全类名.方法名(..)..."/> 注解配置事务@Transactional 可以在service的实现类上添加,那么所有的实现方法都会被事务管理器管理 可以在某一个方法上添加,那么只有配置了注解的方法才会被事务管理器管理 可以在...Service的接口上添加注解,那么所有的接口方法都会被事务管理器管理 我们推荐在Service的接口类上添加注解,并且在只涉及到查询语句的方法中设置传播行为为只读@Transactional(readOnly...,因为这些方法都使用了默认的传播属性PROPAGATION_REQUIRED,我们可以在只涉及到查询语句的方法上添加@Transactional(readyOnly=true),这样可以优化事务管理 实例

    38310

    Spring事务源码解析(二)获取增强

    的实现逻辑 在进行接下来的源码解析之前我想大家应该知道,当我们使用传统的jdbc应用事务的时候是不是做了如下操作: 开启事务 save、update、delete等操作 出现异常进行回滚 正常情况提交事务...答案就是基于@Transactional注解的SpringAOP实现,在接着往下阅读本篇文章的时候希望您对于SpringAOP的源码有一定的了解,如果不了解可以参考如下文章: 基于注解的SpringAOP...); Object cached = this.attributeCache.get(cacheKey); // 从缓存中获取当前方法解析的事务属性,如果解析过,则将解析结果返回...= null) { return txAttr; } // 解析目标方法所在的类,判断其是否标注有事务属性,如果存在,并且目标方法是用户实现的方法,则直接返回...rollBackRules.add(rule); } rbta.getRollbackRules().addAll(rollBackRules); return rbta; } 可以看到这里已经把方法上或者类上的

    55620
    领券