5

ロールバックを可能にするために、PhpMyAdmin データベース エンジンを MyISAM から INNODB に更新しました。

これは私のSQLクエリです:

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');

そして結果:

start transaction;# MySQL returned an empty result set (i.e. zero
rows).
UPDATE jkm_content SET state=1 WHERE title IN ('title-1','title2');# 2 rows affected.

1)したがって、ステートメントは2行が影響を受けていることを通知しますが、変更はどこにも表示されません(DBにもWebサイトにも表示されません)。ただしstart transaction、(一時DBで)変更を視覚化できるようにします。クエリを「コミット」します。commit( DB を更新する必要があることは理解していますが、その場合commit、変更は永続的になります)。

rollback2)それをコミットする前に効果が見えない場合は、ポイントがわかりません。これら2つのクエリの違いは何ですか:

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');

START TRANSACTION;
UPDATE jkm_content SET state=0 WHERE title IN ('title-1','title2');
ROLLBACK;

3) 私が正しければ、これらの関数はすべて同じです:

START TRANSACTION
BEGIN
BEGIN WORK
4

2 に答える 2

11

1) 行ったすべての変更は、同じトランザクション内で表示されます。もしあなたがそうするなら

START TRANSACTION;
INSERT INTO MyTable VALUES ('Hi there');
SELECT * FROM MyTable;

出力には「こんにちは」が含まれます。ただし、2 番目のデータベース接続を開始すると、最初の接続内からトランザクションをコミットするまで、新しい行は表示されません。コマンドラインを使用して 2 つのデータベース接続を使用して、これを試してみてください。

2 つのデータベース接続内で同じトランザクションを持つことはできないため、Web サイトで効果が見られません (新しいデータベース接続はリクエストの開始時に作成されます)。

2) データベースとの接続が閉じられると、コミットされていないすべてのトランザクションがロールバックされます。したがって、これらが 2 つのクエリのみの場合、違いはありません。ただし、違いがあります

START TRANSACTION;
INSERT INTO MyTable VALUES ('This one would be discarded on rollback');
ROLLBACK;
INSERT INTO MyTable VALUES ('This one will be permanent because not within transaction');  

3) はい、これらはすべて同じです。

于 2013-11-10T15:01:03.750 に答える