gpt4 book ai didi

MySQL innodb 过程在事务中仅事件一次(调用多次)

转载 作者:行者123 更新时间:2023-11-29 17:07:34 25 4
gpt4 key购买 nike

首先,我做了一个MYSQL过程来增加一个数字[每次+1](其中没有TRANSACTION),并且我在Spring事务中调用该过程n(n>1)次并得到相同的数字,最后数字+1(预计+n)

其次,我在Procedure中添加了TRANSACTION,并在+1后提交,得到了与上面相同的结果;

第三,我在方法A(A调用Procedure)上添加了@Transaction(rollbackFor = Exception.class,propagation = Propagation.REQUIRES_NEW),并在方法B中多次调用方法A,方法B是用@Transactional注解的,然后我得到了与上面相同的结果;

有人帮忙吗?你能给我一个处理方法吗?

另外: MySQL 中的表

CREATE TABLE `SEQUENCE` (
`ID` bigint(10) NOT NULL ,
`COUNT` int(11) NOT NULL ,
`CUR_DATE` date NOT NULL ,
`READ_ME` varchar(20) CHARACTER SET utf8 COLLATE utf8_general_ci NULL DEFAULT NULL ,
PRIMARY KEY (`ID`)
);

MySQL 中的过程

CREATE DEFINER="root"@"%" PROCEDURE "SEQUENCE_PROCEDURE"(IN _id bigint)
BEGIN
UPDATE `SEQUENCE` SET `COUNT`=-1,CUR_DATE=now() where `ID`=_id and TIMESTAMPDIFF(DAY,CUR_DATE,now())>0 and _id=1;
UPDATE `SEQUENCE` SET `COUNT`=-1,CUR_DATE=now() where `ID`=_id and TIMESTAMPDIFF(MONTH,CUR_DATE,now())>0 and _id=2;
UPDATE `SEQUENCE` SET `COUNT`=`COUNT`+1 where `ID`=_id;
SELECT * FROM `SEQUENCE` where `ID`=_id;
END

mybatis中的SQL

<select id="getSequence" parameterType="java.lang.Long" resultMap="baseResult" statementType="CALLABLE">
{call SEQUENCE_PROCEDURE(#{id,jdbcType=BIGINT,mode=IN})}
</select>

项目中的测试

@Test
@Transactional
public void testSequence() {
System.out.println(sequenceService.getId(2L));
System.out.println(sequenceService.getId(2L));
System.out.println(sequenceService.getId(2L));
}

哪里

public String getId(Long id) {
Sequence sequence = sequenceMapper.getSequence(id);
String temp='000000000000'+sequence.getCount();
return temp.substring(temp.length-12);
}

测试结果

000000000000 000000000000 000000000000 

预期结果

000000000000 000000000001 000000000002 

在Procedure中添加START TRANSACTION和COMMIT不起作用!

最佳答案

在您的过程中,第 1 行和第 2 行对 id 1 和 2 有特定查询(为什么?),并对 _id 变量进行双重比较。另外,第三个查询在另一个表 COUNT 上运行,可能是一个错误。

我更改了假设记录已存在的过程,并将第三个查询更改为 SEQUENCE 表:

CREATE PROCEDURE SEQUENCE_PROCEDURE(IN _id bigint)
BEGIN

UPDATE `SEQUENCE` SET `COUNT`=-1,CUR_DATE=now()
WHERE `ID`=_id and TIMESTAMPDIFF(DAY,CUR_DATE,now())>0;

UPDATE `SEQUENCE` SET `COUNT`=`COUNT`+1 where `ID`=_id;

SELECT * FROM `SEQUENCE` where `ID`=_id;
END

关于MySQL innodb 过程在事务中仅事件一次(调用多次),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/52008411/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com