最近、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;
以上がMySQL はトランザクションのネストをサポートしていますか?の詳細内容です。詳細については、PHP 中国語 Web サイトの他の関連記事を参照してください。