ホームページ > データベース > mysql チュートリアル > MySQL はトランザクションのネストをサポートしていますか?

MySQL はトランザクションのネストをサポートしていますか?

藏色散人
リリース: 2019-05-14 15:15:28
転載
2742 人が閲覧しました

最近、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 サイトの他の関連記事を参照してください。

関連ラベル:
ソース:yurunsoft.com
このウェブサイトの声明
この記事の内容はネチズンが自主的に寄稿したものであり、著作権は原著者に帰属します。このサイトは、それに相当する法的責任を負いません。盗作または侵害の疑いのあるコンテンツを見つけた場合は、admin@php.cn までご連絡ください。
最新の問題
人気のチュートリアル
詳細>
最新のダウンロード
詳細>
ウェブエフェクト
公式サイト
サイト素材
フロントエンドテンプレート