最近、MySQL を使用してトランザクションを複数回開くとデータが混乱するという問題が発生しました。疑似コードは次のとおりです:
begin; # 操作1 begin; # 操作2 rollback;
実行後に操作 1# が発生しました実際には ## のデータが書き込まれ、 のオペレーション 2 のデータのみがロールバックされます。最初のトランザクションがコミットまたはロールバックされていない場合、2 番目のトランザクションが開始されると、最初のトランザクションは自動的にコミットされます。
これは明らかに心理的な期待と一致せず、操作の一部をロールバックすることは不可能です。そこで疑問が生じます。MySQL はトランザクションのネストをサポートしますか?
この質問は、サポートされているかどうかにかかわらず、正確に答えるのが困難です。 まず第一に、begin を複数回呼び出すと、MySQL でのトランザクションのネストは絶対に許可されません。グループの友人に教えてもらったところ、MySQL に savepoint と rollback to というステートメントがあることを知りました。サンプルコード:
DROP TABLE IF EXISTS `test`; CREATE TABLE `test` ( `id` int(10) unsigned NOT NULL AUTO_INCREMENT, `name` varchar(255) DEFAULT NULL, PRIMARY KEY (`id`) ) ENGINE=InnoDB AUTO_INCREMENT=1 DEFAULT CHARSET=utf8; begin; insert into `test`(`name`) values('111'); SAVEPOINT p1; insert into `test`(`name`) values('222'); ROLLBACK TO p1; commit;最終的な実行結果は、テストテーブル内のデータが 111 個だけになり、一部の操作のロールバック操作が実現されます。同様に、トランザクションを複数回開始して前のトランザクションがコミットされるという問題も回避します。 おそらく、セーブポイントとステートメントへのロールバックはトランザクション ネストとは呼べず、MySQL がトランザクション ネストをサポートしているかどうかもわかりません。つまり、セーブポイントとロールバックを使用して、トランザクションのネスト機能を実現できます。
以上がMySQL はトランザクションのネストをサポートしていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。