データベーストランザクションとロックの正確な関係は何ですか?


16

これは、私の知識を増やすという精神で尋ねられた謙虚な質問です。親切に対応してください。

長年のアプリケーション開発者として、私はあるレベルでトランザクションとは何かを知っています(私は常にそれらを使用しています)。トランザクションの分離レベルはさておき、高レベルでは、トランザクションは作業ブロックを完全に完了させるか、まったく完了させず、他のデータベース変更アクティビティからある程度の分離を可能にします。

また、(さまざまなデータベースで)ロックが何であるか、または少なくとも1つの動作を知っています(何らかの方法でテーブルを明示的にロックした場合、他のプロセスまたはスレッドはそのテーブルについて何も更新できません)。

私がはっきりとはっきりしていないのは、さまざまなデータベースで、行またはテーブルを明示的にロックするときに、データベースのトランザクション機能で使用されるものとまったく同じ構造を使用して、トランザクションを適切に機能させることですか?

つまり、トランザクションがアトミックで分離されるためには、何らかのロックを行わなければならないことがわかります。このトランザクションによって開始された、トランザクションに隠されたロックは、さまざまなデータベースが、SELECT FOR UPDATE明示的なLOCKコマンドなどの構造を介してアクセスできるのと同じ種類のロックですか?または、これらの2つの概念は完全に異なりますか?

繰り返しますが、この質問の素朴さをおaびします。より基本的な情報源を指摘できてうれしいです。

回答:


12

行またはテーブルを明示的にロックする場合、トランザクションを適切に機能させるために、データベースのトランザクション機能で使用されるものとまったく同じ構造を使用していますか?

はい。それが当てはまらない場合、独自の「ロック」は他の同様の「ロック」にのみ範囲が限定され、エンジン独自のロックとは相互作用しません。したがって、テーブル内の行をロックして、同じ方法で別のアプリケーションがロックできないようにしますが、そのロックはエンジン自体によって無視されます。これらのセマンティクスはほとんど必要ありません。ほとんどの場合、アプリケーションが行をロックするとは、「アクセス/変更のあらゆる手段に対してロックする」ことを意味します。厳密にアプリケーション固有のロックメカニズム存在することに注意してください。これらは便利なためです。たとえば、SQL Serverにはアプリケーションロックがあります

トランザクションがアトミックで分離されるためには、ロックを行わなければならないことがわかりました。

ロックはこれを達成する1つの手段です。主な代替手段はバージョン管理です。現在、ほとんどのデータベースは両方をサポートしています(つまり、アプリで行を「ロック」するが、別のトランザクションがバージョニングを使用して行を読み取る場合、ロックがバージョン化された読み取りをブロックしないため、それが読み取られます)。

データベース実装の世界で「2フェーズロックプロトコル」として知られている概念をめぐって回っています。リンクされたウィキペディアの記事は良い手始めです。このトピックに関する詳細な説明を読みたい場合は、ライブラリにアクセスして、トランザクション処理:概念とテクニックの融資を依頼することをお勧めします。ほぼすべてのデータベースは、その中心にその本の実装があります。


おそらく、あなたは(ロックなし)について、追加することができオプティミスティック同時実行制御
ypercubeᵀᴹ

あぁ!今話しています。実際、私の心の奥に潜んでいるのはMVCCでした。明確な回答、素晴らしい参考文献、そして私の質問を本当に掘り下げて時間を割いてくれてありがとう。
レアード・ネルソン14年

3

質問に答える前の背景:

注:これはMicrosoft SQL Serverに関連しています-RDBMS ........

  • 非常に簡単に言えば、トランザクションとは一連の作業であり、全体として単一の論理ユニットとして実行する必要があり、ACIDプロパティを維持する必要があります。
  • RDBMSは、トランザクションの分離と耐久性を維持することにより、トランザクション全体を完了するために使用できる「ロック機能」を提供する必要があります。これにより、データベースの物理的整合性が保証されます。
  • 最も重要なこととして、デフォルトでは、トランザクションは接続レベルで管理されます。そのため、接続でトランザクションが開始されると、その接続で実行されるすべてのT-SQLステートメント(S / I / U / D)は、トランザクションが終了するまでトランザクションの一部になります。(MARSは異なる方法で処理されます)

質問に戻りましょう。

行またはテーブルを明示的にロックする場合、トランザクションを適切に機能させるために、データベースのトランザクション機能で使用されるものとまったく同じ構造を使用していますか?

はい。これは、変更されるデータのシーケンスを決定する際に注意する必要があり、データベースを一貫した状態に保つことを意味します。言い換えれば、DML操作では、データベースを組織のビジネスルールに限定された一貫した状態にしておく必要があります。それでも、RDBMS(ここではSQL Server)はトランザクションの物理的整合性を強化できます。

BOLから:ロックと行のバージョン管理により、ユーザーがコミットされていないデータを読み取ったり、複数のユーザーが同じデータを同時に変更しようとすることを防ぎます。ロックまたは行のバージョン管理なしで、そのデータに対して実行されたクエリは、データベースでまだコミットされていないデータを返すことで予期しない結果を生成する可能性があります。

このトランザクションによって開始される、トランザクションによって隠されるロックは、さまざまなデータベースがSELECT FOR UPDATEや明示的なLOCKコマンドなどの構造を介してアクセスできるのと同じ種類のロックですか?

SQLサーバーのすべてがトランザクションに含まれています。データにアクセスするとき、RDBMSは分離レベルとデータに対して実行している操作に応じてロックを取得する必要があります。詳細については、この回答を確認してください。

良い参考文献:


2

トランザクションは、データベースの「インターフェース」の一部であると言えます。開発者は、トランザクションの範囲内で開始、終了、何をすべきかなどを決定するという意味です。ロックは、実装の詳細に属します。さまざまなオブジェクトへのアクセス同期に使用されます。ほとんどの場合、エンジン自体が何をどのくらいの期間ロックするかを決定します。直接操作できないシステムレベルのロックが多数あります(たとえば、エンジンが特定のメモリ領域をロックする場合があります)。DMLロックに関しても、それらの多くは舞台裏で発生します(たとえば、参照整合性を確保するために、Oracleが記憶している限り、新しいレコードが挿入されると、SQLServerはマスターテーブルの対応する行にロックをかけることがあります)詳細テーブル)トランザクション内で発行されたDMLステートメントの結果として。

トランザクションに関しては、SQLに準拠し、トランザクションをサポートすると主張するRDMSから、ほぼ一貫した動作を期待できますが、ロックに関しては、ほとんどすべてのベンダーが異なる戦略と用語を使用しています。私が知る限り、すべてのRMDSに共通する部分は、トランザクション間の同時実行性は分離レベルによって定義され、ロック間の同時実行性はロックタイプ(共有、排他など)によって制御されることです。

要約すると、ロックは、オブジェクトの一貫性と同時実行性を制御する低レベルのメカニズムです。ロックは、SQLステートメントの実行中に発行できます。トランザクション分離レベルの実装に応じて、エンジンは影響を受けるオブジェクト(行、行のグループ、インデックスなど)に異なるタイプのロックをかけることがあります。手動でロックを発行するために使用できるコマンドの数は限られています(SELECT FOR UPDATELOCK)。DMLロックはエスカレーションできます(たとえば、SQLServerのrow-> page-> partition-> tableでRDMSに依存します)。ロックは、接続の開始、バックアップ、復元、プロシージャ/トリガー/関数/などの再コンパイル、起動、シャットダウンなどの際にデータベースエンジンによって発行することもできます。

それがあなたの質問に答えるかどうかはわかりませんが、それが理にかなっていることを願っています。


コメントありがとうございます。あなたは間違いなくこれまでで一番近いです。私はまだ、トランザクションが、たとえば明示的なLOCKor SELECT FOR UPDATEステートメントによって、または他のメカニズムによって使用されるロックに関して常に実装されているかどうかを確認しようとしています。
レアードネルソン14年

私の知る限り、BEGIN TRANSACTIONそれ自体はロックを発行しません。ロックは、トランザクション内のDMLの後に表示されます。
a1ex07 14年

明確化-私BEGIN TRANSACTION自身はDMLロックを作成しないことを意味しました。それがリソースを割り当てる必要があるため、実際の問題にいくつかの内部ロックをすべきで、システムテーブルにエントリを追加し、[S](もしあれば)アクティブなトランザクションを保持していること、など
a1ex07

1

SQL Serverの専門用語を使用しますが、概念は他のベンダーと同じである必要があります。

実行するすべてのコマンドは、トランザクション内で実行されます。そのトランザクションは、データベースエンジンによってBEGIN TRANで明示的に、または暗黙的に開くことができます。暗黙的なトランザクションが開かれる理由は、エンジンが引き続きACIDコンプライアンスとロールバック機能を維持する必要があるためです。

SELECT FOR UPDATEを実行すると、トランザクションが実行されている間、特定のロックが保持されることを意味します。


コメントありがとうございます。それだけ知っています。しかし、私の質問はまだです:そのトランザクションが開かれたとき、それ自身のロックを保持することによってその分離は達成されますか?その場合、それらのロックは、明示的に取得できるのと同じ種類のロックですか?または、トランザクションは他の手段によって分離を達成しますか?
レアードネルソン14年

2
はい、これは同じメカニズムです。分離は、両方のモードでロックを使用して達成されます。明示的に取得できるロックと同じです。違いは、トランザクションを明示的に開かない場合、コマンドが終了するとロックが解除されるのに対して、明示的なトランザクションでは、コミットするまでロックが保持されることです(分離レベルのために100%正確ではありませんが、それは一般的なアイデア)。
マタンヨンマン14年

コメントありがとうございます。私が質問している理由は、ACIDトランザクションを達成する手段としてMVCCを使用しているデータベースがあることをどこかで読んだことです。そのような場合、ロックをいつ明示的に発行したいのか明確ではありません。しかし、それはおそらく別の質問です。:-)
レアードネルソン14年

SQL Server のスナップショット分離レベルである@LairdNelson 。既存ですが、並行性のデフォルトのメカニズムではありません。ただし、IIRCはOracleまたはPostgresqlのデフォルトです。
マリアン14年

0

ロックが必要であり、データベースを作成します。これにより、複数のユーザーがデータベースへの書き込み中に複数のユーザーが読み取ろうとしたときに、データが破損または無効化されるのを防ぎます。トランザクションの分離は、通常、トランザクションでアクセスされるものをロックすることで実装されます。悪い設計のアプリケーションは、データベースロックの概念を大いに活用します:) !! したがって、ロックを回避するには、FKとデータレイアウトに集中してください。

それはすべてACIDについてです: -これを読んで、それはあなたの心をクリアします!ACIDは、データベースを変更するときに適用するプロパティのセットです。

  • **原子性
  • 一貫性
  • 分離
  • 耐久性**

トランザクションは、いくつかのACIDプロパティを達成するために使用される関連する変更のセットです。トランザクションは、ACIDプロパティを実現するツールです。

アトミック性とは、すべてのトランザクションが発生することを保証できること、またはトランザクションがまったく発生しないことを保証できることを意味します。単一のユニットとして複雑な操作を行うこともできますが、クラッシュ、停電、エラーなど、関連する変更の一部のみが発生した状態になることはありません。

一貫性とは、データの一貫性を保証することです。関連データにある制約に違反することはありません。

分離とは、1つのトランザクションがまだ完了していない別のトランザクションからデータを読み取れないことを意味します。2つのトランザクションが同時に実行されている場合、それぞれは順番に実行されているかのようにワールドを認識し、一方が他方によって書き込まれたデータを読み取る必要がある場合、他方が完了するまで待機する必要があります。

耐久性とは、トランザクションが完了すると、すべての変更が耐久性のあるメディア(ハードディスクなど)に記録され、トランザクションが完了したという事実も同様に記録されることを意味します。

したがって、トランザクションはこれらのプロパティを保証するメカニズムです。これらは関連するアクションをグループ化する方法であり、全体として、操作のグループはアトミックで、一貫した結果を生成し、他の操作から隔離され、永続的に記録されます。


ご意見をありがとうございます。私は少なくともACIDの特性を十分に認識しています。私はまだ明確ではありません:トランザクションはLOCK、明示的なステートメントを介して直接使用できる同じ種類のロックを使用してACIDを実装しますか、それとも他のメカニズムを使用して実行しますか?
レアードネルソン14年

データベースには、データを選択するときに発生するロックの程度を制御するトランザクション分離レベルが多数用意されています。シリアル化可能、繰り返し可能読み取り、コミット済み読み取り、コミットされていない読み取り
Up_One 14年
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.