1

トランザクションを使用してデータベースにデータを書き込むサーバーがあり、すべてのクエリが成功した場合はコミットされ、そうでない場合はロールバックされます。ここで、サーバーの 2 つのインスタンスを同じデータベースとテーブルで同時に動作させたいと考えています。mysql のトランザクション ドキュメントを読んでいるときに、「トランザクションを開始すると、保留中のトランザクションがコミットされます」という文に気付きました。これは、サーバー A がトランザクション A を開始し、トランザクション A がまだ完了していない間にサーバー B がトランザクション B を開始した場合、トランザクション A は強制的にコミットされるということですか? これは私には意味がありません。この場合、トランザクション A が正常に完了するまでトランザクション B が実行されないようにするにはどうすればよいですか? SET autocommit = 0 は、この問題の代わりになりますか?

4

2 に答える 2

2

サーバーの 2 つのインスタンスを同時に動作させたいと言うとき、同じサーバー上で実行されている 2 つの別個のセッションを意味すると仮定します。

「トランザクションを開始すると、保留中のトランザクションがコミットされる」という文は、同じセッション内の保留中のトランザクションのみを指します。http://dev.mysql.com/doc/refman/5.7/en/implicit-commit.htmlから

このセクションにリストされているステートメント (およびそれらの同義語) は、ステートメントを実行する前に COMMIT を実行したかのように、現在のセッションでアクティブなトランザクションを暗黙的に終了します。

したがって、セッション A がコミットされる前にセッション B がトランザクションを開始しても、セッション A は強制的にコミットされません。

于 2013-11-14T20:04:38.253 に答える
0
mysql> CREATE TEMPORARY TABLE super(id int);
Query OK, 0 rows affected (0.04 sec)

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> INSERT INTO super VALUE(1);
Query OK, 1 row affected (0.00 sec)

mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

mysql> SELECT * FROM super;
+------+
| id   |
+------+
|    1 |
+------+
1 row in set (0.00 sec)
于 2014-11-18T15:04:27.013 に答える