Во-первых, я создал процедуру 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 в Процедуре не работают!