2011-03-13 22 views
1

なしのMySQLのトランザクションをコミット私はtheir documentは、IF ELSE END IFのみストアド・プロシージャではサポートされていることを述べました。は条件付きストアドプロシージャ

MySQL supports the IF, CASE, ITERATE, LEAVE LOOP, WHILE, and REPEAT constructs for flow control within **stored programs**. 

cliを使用して実行中のバッチステートメントではサポートされていないように見えました。

パフォーマンスを最適化し、往復を減らすために、アプリケーションによるROW_COUNT()の読み取りは考慮されません。 mysqlが光の速さでそれを取ることができるならば最高です。

追加のストアドプロシージャを使用せずに動作させるにはどうすればよいですか?いずれかが間違っている場合、更新のチェーンを中断するために、すべてのUPDATEでWHERE ROW_COUNT()を使用しようとしました。何も変更すべきではないにしても、トランザクションの開始は複製されません。

EDIT:要するに

、私は、ストアドプロシージャを使用せずに、crondスケジュールで

START TRANSACTION 
UPDATE `table_a` SET a=1 WHERE id=1 AND addition=2; 
UPDATE `table_b` SET a=1 WHERE id=1 AND another_rule=3; 
IF UPDATE_COUNT() = 1 
THEN 
    COMMIT 
ELSE 
    ROLLBACK 
END IF 

をどのように行うのですか。

+0

あなたがしようとしていることはまったく明らかではありません。言い直してください/精巧にしてください。 – Mat

答えて

0

あなたがしたいことは、ストアドプロシージャなしで可能であるとは思えません。ストアドプロシージャを使用することに嫌うのはなぜですか?私がこのatmをやっていると考えることができる唯一の他の方法は、あなたの複製を整えて、一歩であなたのコミットを行うことができるステージテーブルを用意することです。

マalks。

0

ストアドプロシージャを使用したくない場合は回避してください。それは

SET autocommit=0;
UPDATE table_a SET a=1 WHERE id=1 AND addition=2;
UPDATE table_b SET a=1 WHERE id=1 AND another_rule=3;
SET autocommit=IF(UPDATE_COUNT()=1,1,2);

ないUPDATE_COUNT() = 1場合、自動コミットは2に設定され、これが
Variable 'autocommit' can't be set to the value of '2'
は、この例外を処理し、ROLLBACK;

を実行し、例外がスローされます私のために正常に動作します