GABBBBABAG 2024-07-05 16:09 采纳率: 50%
浏览 30
已结题

jdbc postgresql 报错:org.postgresql.util.PSQLException: 不能在事务交易过程中改变事物交易隔绝等级。

代码逻辑自定义一个注解 ZTransaction ,可以指定四个事务级别,然后在带有此注解的方法执行之前,从连接池获取一个Connection对象,然后
根据注解设置的级别来执行 connection.setTransactionIsolation 然后 connection.setAutoCommit(false).
然后就是正常流程了,try里执行目标方法然后commit,catch里回滚事务,finally 里归还Connection对象并重置为默认的隔离级别。

mysql是没问题的。可是pgsql有时候会在 connection.setTransactionIsolation 这行报错:org.postgresql.util.PSQLException: 不能在事务交易过程中改变事物交易隔绝等级。
不是百分百报错。问了通义和chatgpt都说 connection.setTransactionIsolation 放在 connection.setAutoCommit(false) 之前就行了,我改成在之前,也是偶尔报这个错。找不到原因了,请问怎么办?

  • 写回答

1条回答 默认 最新

  • 专家-赤兔[在线] 全栈领域优质创作者 2024-07-05 16:09
    关注

    引自免费微信小程序:皆我百晓生

    根据您提供的描述和报错信息,问题似乎出在 PostgreSQL 数据库的事务处理上。您正在尝试在事务过程中更改事务隔离级别,而 PostgreSQL 在某些情况下不允许这样做。这可能是由于事务已经处于活动状态,再次尝试更改隔离级别引发了错误。

    针对这个问题,我有以下几点建议:

    1. 确保事务初始状态正确:在开启事务之前确保数据库连接处于自动提交模式(即 connection.setAutoCommit(true)),然后再设置事务隔离级别。这样,当您开始事务(通过 connection.setAutoCommit(false))时,数据库连接将处于正确的初始状态。
    2. 避免在事务中间更改隔离级别:尽量避免在事务执行过程中更改隔离级别。如果可以的话,在事务开始之前设置所需的隔离级别,并保持其在整个事务期间不变。
    3. 捕获并处理异常:鉴于这种错误不是百分之百发生,您可以尝试捕获 PSQLException 并进行相应的处理。例如,当捕获到这种特定异常时,可以尝试回滚当前事务并重新尝试操作。
    4. 检查连接池配置:确保连接池中的连接在使用前处于正确的状态。有时连接池中的连接可能处于不完全的关闭状态或者有其他问题,这可能导致事务处理出现问题。
    5. 更新PostgreSQL和JDBC驱动版本:确保您使用的 PostgreSQL 数据库和 JDBC 驱动版本是最新的,因为旧版本可能存在已知的问题或缺陷。
    6. 简化代码逻辑:简化您的代码逻辑,避免复杂的嵌套事务或多次更改事务隔离级别等操作,以减少出错的可能性。

    如果以上建议不能解决您的问题,建议您深入研究具体的数据库操作和事务管理细节,考虑查阅 PostgreSQL 的官方文档和 JDBC 相关文档,看是否有其他相关的指导或限制。另外,如果您可以分享更多关于您的代码实现和数据库配置的信息,我可能能提供更具体的帮助。

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论 编辑记录

报告相同问题?

问题事件

  • 系统已结题 7月13日
  • 已采纳回答 7月5日
  • 创建了问题 7月5日

悬赏问题

  • ¥15 如何在vue.config.js中读取到public文件夹下window.APP_CONFIG.API_BASE_URL的值
  • ¥50 浦育平台scratch图形化编程
  • ¥20 求这个的原理图 只要原理图
  • ¥15 vue2项目中,如何配置环境,可以在打完包之后修改请求的服务器地址
  • ¥20 微信的店铺小程序如何修改背景图
  • ¥15 UE5.1局部变量对蓝图不可见
  • ¥15 一共有五道问题关于整数幂的运算还有房间号码 还有网络密码的解答?(语言-python)
  • ¥20 sentry如何捕获上传Android ndk 崩溃
  • ¥15 在做logistic回归模型限制性立方条图时候,不能出完整图的困难
  • ¥15 G0系列单片机HAL库中景园gc9307液晶驱动芯片无法使用硬件SPI+DMA驱动,如何解决?