MySQL innodb Процедура активна только один раз (несколько раз для вызова) в транзакции - PullRequest
0 голосов
/ 24 августа 2018

Во-первых, я создал процедуру MYSQL для увеличения числа [+1 каждый раз] (в ней нет транзакций), и я вызвал процедуру n (n> 1) раз в Spring-транзакции и получил то же число и число +1 наконец (ожидается + n)

Во-вторых, я добавил TRANSACTION в Процедуру и передал atfer +1, и получил тот же результат, что и выше;

В-третьих, я добавил @Transaction (rollbackFor = Exception.class, распространение = Propagation.REQUIRES_NEW) в метод A (вызов процедуры A) и вызвал несколько раз метод A в методе B, который аннотируется @Transactional, затем Я получил тот же результат, что и выше;

Кто-нибудь поможет? Вы можете дать мне способ справиться с этим?

Plus: таблица в 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

SQL в mybatis

<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 

добавить START TRANSACTION и COMMIT в Процедуре не работают!

1 Ответ

0 голосов
/ 27 августа 2018

В вашей процедуре строки 1 и 2 имеют конкретные запросы к идентификаторам 1 и 2 (почему?) И двойное сравнение с переменной _id. Также третий запрос выполняется на другой таблице COUNT, возможно, это ошибка.

Я изменил процедуру, предполагая, что запись уже существует, и изменил третий запрос на SEQUENCE table:

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
...