GBase 8s
适配迁移
问答

求助:select XXX for update语句报错:语句不在一个事务内

发表于2024-05-29 10:41:53504次浏览5个评论

为提高效率,提问时请提供以下信息,问题描述清晰可优先响应。

【GBase版本】: GBase 8s V8.8

【操作系统】: Linux

【CPU】:

【问题描述】*: 
系统原本使用MySQL8数据库,架构包含:springboot-2.3.3.RELEASE + mybatisplus-3.5.1 + quartz-2.3.2,在适配GBase 8s 时,出现以下问题:GBase8s数据库初始化后,启动系统,在系统启动后,quartz框架执行sql语句时,出现报错如下:

2024-05-29 10:28:45.085 ERROR 17872 --- [           main] druid.sql.Statement                      : {conn-110001, pstmt-120006} execute error. select *
from QRTZ_LOCKS
where SCHED_NAME = 'zhScheduler'
    and LOCK_NAME = 'TRIGGER_ACCESS'
for update

java.sql.SQLException: 语句不在一个事务中。
    at com.gbasedbt.util.IfxErrMsg.getSQLException(IfxErrMsg.java:409) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxSqli.a(IfxSqli.java:3576) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxSqli.D(IfxSqli.java:3856) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxSqli.dispatchMsg(IfxSqli.java:2746) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxSqli.receiveMessage(IfxSqli.java:2671) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxSqli.a(IfxSqli.java:1884) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxSqli.executeStatementQuery(IfxSqli.java:1648) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxSqli.executeStatementQuery(IfxSqli.java:1543) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxResultSet.a(IfxResultSet.java:215) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxStatement.executeQueryImpl(IfxStatement.java:1253) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.gbasedbt.jdbc.IfxPreparedStatement.executeQuery(IfxPreparedStatement.java:540) ~[gbase-connector-java-3.5.1.jar:3.5.1_1_d0c87a]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3225) [druid-1.2.16.jar:na]
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:459) [druid-1.2.16.jar:na]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3222) [druid-1.2.16.jar:na]
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:459) [druid-1.2.16.jar:na]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3222) [druid-1.2.16.jar:na]
    at com.alibaba.druid.filter.FilterEventAdapter.preparedStatement_executeQuery(FilterEventAdapter.java:459) [druid-1.2.16.jar:na]
    at com.alibaba.druid.filter.FilterChainImpl.preparedStatement_executeQuery(FilterChainImpl.java:3222) [druid-1.2.16.jar:na]
    at com.alibaba.druid.proxy.jdbc.PreparedStatementProxyImpl.executeQuery(PreparedStatementProxyImpl.java:166) [druid-1.2.16.jar:na]
    at com.alibaba.druid.pool.DruidPooledPreparedStatement.executeQuery(DruidPooledPreparedStatement.java:213) [druid-1.2.16.jar:na]
    at org.quartz.impl.jdbcjobstore.StdRowLockSemaphore.executeSQL(StdRowLockSemaphore.java:123) [quartz-2.3.2.jar:na]
    at org.quartz.impl.jdbcjobstore.DBSemaphore.obtainLock(DBSemaphore.java:113) [quartz-2.3.2.jar:na]
    at org.quartz.impl.jdbcjobstore.JobStoreCMT.executeInLock(JobStoreCMT.java:238) [quartz-2.3.2.jar:na]
    at org.quartz.impl.jdbcjobstore.JobStoreSupport.clearAllSchedulingData(JobStoreSupport.java:2002) [quartz-2.3.2.jar:na]
    at org.quartz.core.QuartzScheduler.clear(QuartzScheduler.java:1547) [quartz-2.3.2.jar:na]
    at org.quartz.impl.StdScheduler.clear(StdScheduler.java:239) [quartz-2.3.2.jar:na]
 

然后我通过idea的数据库连接管理组件连接到Base8s,单独执行select XXX for update,一样会报错:语句不在一个事务中

有没有遇到过相同问题的朋友,有没有什么办法解决?

评论

登录后才可以发表评论
用户头像
曾阿牛发表于 2年前
用户头像
曾阿牛发表于 2年前
> begin;

Started transaction.

> select * from t300 where id>=2 for update;



id 3
col1 cccccc
col2 2024-05-22 11:36:10

id 4
col1 ddddddddd
col2 2024-05-23 14:50:02

2 row(s) retrieved.
chendz发表于 2年前
@曾阿牛:这个我试过,但问题是之前适配的几种数据库都可以直接执行,为啥这个要这么显示执行begin语句,如果创建库的时候设置为ANSI兼容模式,就不用显示执行这个了吧,但需要执行 commit?
用户头像
曾阿牛发表于 2年前
> ^C[gbasedbt@GBASEDB ~]$ dbaccess gbasedb -

Database selected.

> begin;

Started transaction.

> select * from t300 where id>=2 for update;



id 3
col1 cccccc
col2 2024-05-22 11:36:10

id 4
col1 ddddddddd
col2 2024-05-23 14:50:02

2 row(s) retrieved.
最佳回答
GBase用户51935发表于 2个月前
蹲个答案。