Home > C# > PostgreSQL > Npgsql > ドキュメント

トランザクション Npgsql

新規作成日 2019-02-26
最終更新日

トランザクション

Transactions

基本的なトランザクション

Basic Transactions

トランザクションは、標準のADO.NETメソッドのNpgsqlConnection.BeginTransaction()を呼び出すことによって、開始することができます。

PostgreSQLは、入れ子や並列のトランザクションをサポートしません。-ある時点で進行中のトランザクションは、1つだけです。既にトランザクションが、進行しているときに、BeginTransaction()を呼び出すと、例外が投げられます。このため、BeginTransaction()から返されたNpgsqlTransactionオブジェクトを、実行するコマンドに渡す必要はありません。-BeginTransaction()を呼び出すことは、コミットやロールバックが、実行されるまで、後に続くすべてのコマンドが、自動的に、トランザクションに関与することを示しています。しかしながら、移植性を最大にするために、あなたのコマンドの上で、トランザクションを設定することを推奨します。

同時トランザクションは、サポートされていませんが、PostgreSQLは、セーブ・ポイントの概念をサポートしています。-あなたは、トランザクションで、名前の付いたセーブ・ポイントを設定するかもしれません。そして、トランザクション全体をロール・バックすることなく、後で、ロールバックします。セーブ・ポイントは、作成し、元に戻し、それぞれ、NpgsqlTransaction.Save(name)、NpgsqlTransaction.Rollback(name)とNpgsqlTransaction.Release(name)によって解放することができます。詳細は、PostgreSQLドキュメントを参照してください。

BeginTransaction()を、呼び出すとき、あなたは、必要に応じて分離レベルを設定できます。詳細については、ドキュメントを参照してください。

System.Transactionsと分散トランザクション

System.Transactions and Distributed Transactions

DbConnection.BeginTransaction()に加えて、.NETには、トランザクションを管理するための代替APIのSystem.Transactionsが、含まれています。-MSDNのドキュメントを読み、関連する概念を理解してください。Npgsqlは、完全に、このAPIをサポートしています。そして、バージョン3.3以降では、自動的に、アンビエントTransactionScopesに参加します。(接続文字列で、Enlist=falseを指定することによって、あなたは、登録を無効にすることができます)。

1つ以上の接続(やリソース)が、同じトランザクションに参加するとき、トランザクションは、分散されていると、言います。分散トランザクションでは、自動的に、2相コミット・プロトコルを通して、複数のデータベース(やリソース)にまたがって、変更を実行できます。-ここに、MSDNドキュメントが、あります。Npgsqlは、分散トランザクションをサポートします。-サポートは、多くの問題を修正したバージョン3.2のために、書き換えられ続けています。しかしながら、この時点では、Npgsqlは、不安定なリソース・マネージャとして参加しています。実行中に、アプリケーションが、クラッシュした場合、回復が、適切に管理されないことを示しています。この詳細については、このページと関連するページを参照してください。あなたが、より優れた分散型のトランザクション・リカバリを見たい場合、(例えば、永続的なリソース・マネージャの登録)、この問題のために、発言し、更新のために、それを購読して下さい。

あなたが、内部の周囲のトランザクションと同じデータベースのコネクションを開く、そして、閉じる場合、Npgsqlが、本格的な分散型のトランザクションに、エスカレーションを回避するために、2つの接続を同時に開くことなく、内部的に同じ接続を再利用することに注意してください。これは、性能、そして、一般的な単純さのために、より優れています。

このエントリーをはてなブックマークに追加

Home PC C# Illustration

Copyright (C) 2011 Horio Kazuhiko(kukekko) All Rights Reserved.
kukekko@gmail.com
ご連絡の際は、お問い合わせページのURLの明記をお願いします。
「掲載内容は私自身の見解であり、所属する組織を代表するものではありません。」