2016-11-24 3 views
0

я написал хранимую процедуру, и я поставил в начале этих заявления:Mysql сделка не работает в хранимой процедуре

SET autocommit = 0; 

START TRANSACTION READ WRITE; 

я закончу с COMMIT; заявления.

но сделка не работает.

Вы можете помочь?

обновление 1:

Может эта инструкция

SET @now = unix_timestamp() * 1000; 

причиной неявной фиксации?

обновление 2: мой код, как этот

CREATE PROCEDURE stored_proc() 

SQL SECURITY DEFINER 

BEGIN 

SET autocommit = 0; 

START TRANSACTION; 

DELETE FROM `TABLE1` WHERE `COLUMN1` = value; 

INSERT INTO TABLE1... 

SET @now = unix_timestamp() * 1000; 

DELETE FROM TABLE2 WHERE COLUMN2 = value; 

INSERT INTO `TABLE2` ...; 

COMMIT; 

END 

У меня есть IHM, который отображает данные из таблицы TABLE2. Я заметил, что при выполнении хранимой процедуры IHM отображает нулевые значения. Это означает, что принятие было сделано после того, как второй DELETE и перед INSERT

Update 3

select @@tx_isolation; дает мне REPEATABLE-READ и show create table table2 дает мне engine = InnoDB в конце результата

+0

Вы используете InnoDB? MyISAM не реализует транзакции. – Barmar

+0

Да, я использую innodb. – Aniss

+0

Что происходит, когда вы говорите, что это «не работает», откуда вы знаете, что он не работает? Ваш код в обновлении не вызывает неявного фиксации, например. любой код ddl (например, 'alter table') сделает это. Вы должны добавить всю свою процедуру (вы можете сокращать, точный код не имеет значения, например, просто напишите 'select ...') и опишите, что (не происходит), и что вы ожидаете. И, кстати, вам не нужно использовать 'set autocommit = 0', чтобы начать транзакцию,« start transaction »используется для начала транзакции. «Commit» не сбрасывает «autocommit» на 1, поэтому вам потребуется «commit» с этого момента. – Solarflare

ответ

0

Проблема заключалась в том В мой Java-код, у меня был

<Resource username="$user" url="$url" type="javax.sql.DataSource" password="$pwd" name="$jndi" maxWait="-1" maxIdle="$idle" maxActive="$max" driverClassName="com.mysql.jdbc.Driver" defaultTransactionIsolation="READ-UNCOMMITTED" /> 

Я обновленное с defaultTransactionIsolation = "REPEATABLE_READ", чем ks очень @Solarflare для вашей помощи. Я не думал об уровне изоляции.