mysql报错:can be executed in a non-transactional context only

业务场景报错:

日志报错信息:

java.sql.SQLException: When @@GLOBAL.ENFORCE_GTID_CONSISTENCY = 1, the statements CREATE TEMPORARY TABLE and DROP TEMPORARY TABLE can be executed in a non-transactional context only, and require that AUTOCOMMIT = 1.

报错翻译:

java.sql。SQLException:当@全局时。ENFORCE_GTID_CONSISTENCY=1时,只能在非事务上下文中执行CREATE TEMPORATY TABLE和DROP TEMPORATE TABLE语句,并要求AUTOCOMMIT=1。

目标:获取考评得分的排名

实际上最理想的就是直接按得分倒序排列,获取行号:

select a.objectguid,score,(@rowNum:=@rowNum+1) as rank
	from audit_performance_stardetail a,(select (@rowNum :=0)) b
	WHERE starguid = '42d96ff4-6aad-4c6f-9e2e-4b999ec5c45c'
	ORDER BY Score DESC
;

但实际因为使用了公司自己的封装框架,(@rowNum:=@rowNum+1)因为存在特殊字符会被截断字符串,从而报错,故此寻求另一种存储过程的方式:

-- 创建存储过程
CREATE PROCEDURE `getObjectRank`(IN in_starguid varchar(50), IN in_objectguid varchar(50))
BEGIN
	-- DECLARE rowNum INT;
	-- SET rowNum = 0;

CREATE TEMPORARY TABLE IF NOT EXISTS Temp_Star_Rank (
	objectguid VARCHAR (50),
	score DOUBLE,
	rank INT
);

INSERT  INTO Temp_Star_Rank
	select a.objectguid,score,(@rowNum:=@rowNum+1) as rank
	from audit_performance_stardetail a,(select (@rowNum :=0)) b
	WHERE starguid = in_starguid
	ORDER BY Score DESC
;

SELECT * FROM Temp_Star_Rank
WHERE objectguid = in_objectguid;

DROP table Temp_Star_Rank;

END

以上为最开始的存储过程,经过localhost应用调试,成功,没有报错!

本地mysql版本:

 服务器mysql版本:

但更新至服务器后报错最开始的报错。

show variables like 'autocommit'

 解决方法1:失败!

解决方法2:成功!

 解决方法3:成功!

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值