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

Posted

技术标签:

【中文标题】我可以在调用返回结果集但也更新行的存储过程的方法上使用@Transactional(readOnly = true) 吗?【英文标题】:Can i use @Transactional(readOnly = true) on a method that calls a stored procedure which returns resultsets but also updates rows? 【发布时间】:2021-11-18 11:28:28 【问题描述】:

我有一个通过entityManager 实例调用存储过程的方法

    ProcedureCall storedProcedureCall = entityManager.unwrap(Session.class).createStoredProcedureCall(StoredProcedures.GET_WEB_APPLICATION_STATE_DATA_AND_UPDATE_USER_STATUS.toString());

此存储过程检索用户偏好,同时将用户状态从离线更新为在线。我可以使用@Transactional(readOnly = true) 而不是@Transactional,因为更新查询不是由数据请求应用程序本身完成的吗?

【问题讨论】:

【参考方案1】:

答案似乎是否定的。当我在调用存储过程的方法上使用@Transactional(readOnly = true) 时,该存储过程既获取数据又写入数据,我会得到异常。

java.sql.SQLException: Connection is read-only. Queries leading to data modification are not allowed

【讨论】:

以上是关于我可以在调用返回结果集但也更新行的存储过程的方法上使用@Transactional(readOnly = true) 吗?的主要内容,如果未能解决你的问题,请参考以下文章

如何调用返回 1 行的存储过程?

MySQL 存储过程,获取使用游标查询的结果集

如何定义 java 定义的存储过程以返回多个结果集?

执行不返回结果的存储过程时引发错误

我可以在 jdbc 中调用一个使用 mysql 返回表的存储过程吗?

mssql 存储过程调用另一个存储过程中的结果的方法分享