レコードは、データの整合性を確保し、各ユーザに共通のビューを提供するためにロックされ、その一方で最大の同時実行性を実現します。ロックすることにより、ユーザが参照したり修正したりしている時に、レコードが変更されることを回避できます。
Magic xpaは、以下の3種類のロックを提供しています。
Magicロック …… Magic xpaは、MGLOCKファイルを使用してロックを管理します。データベースのロック機構を使用したくなかったり、使用できない場合、このタイプのロックを使用します。ほとんどはISAMデータベースで使用され、SQLデータベースで使用されることはありません。
物理ロック …… Magic xpaは、データベースに実際にロックを発行します。データベースはロックを管理して、さまざまなインターフェース(アプリケーションまたはデータベースツール)を使用した他のユーザによるレコードの変更を防止します。
論理ロック ……論理ロックは、ロックのシミュレーションです。実際に外部ロックがデータベースに発行されることはありません。Magic xpaは、ロックを行う代わりに、レコードが最初に読み込まれた時から他のユーザによって変更されたレコードデータの内容がデータベースに書き込まれないようにするため、ソフトウェアによるチェックを行います。
トランザクションとロックは、RDBMSで密接に関連しています。SQLデータベースはマルチユーザ環境で実行されるので、無計画なロックによって、ユーザのアプリケーションへのアクセスが極端に制限されてしまうことがあります。全てのRDBMSでは、さまざまなロックのレベルを設定できます。
ISAMでは、更新の際にレコードがロックされ、更新が完了するとすぐに解放されます。RDBMSでは、トランザクションの開始時には必ずロックが行われ、COMMITまたはROLLBACK処理コマンドによってのみ解放されます。
通常の処理中は、RDBMSはビュー構造をロックします。暗黙のロックが自動的に実行されて、他のユーザからのアクセスからデータを保護します。
デフォルトのロックを変更する機能は、明示的ロックとして知られています。SQLステートメントが実行されると、暗黙のロックが自動的に発生します。たとえば、INSERT、UPDATE、DELETEの各ステートメントは、トランザクション中データの一貫性と完全性を維持するように、暗黙のロックを発行します。
いくつかのRDBMS(例えばOracle)は、レコードレベルでロックされます。RDBMSによってはページレベルのロックのみを行います。この場合、同じページ内の他のレコードがロックの原因になります。
ロックレベル
SQLのロックには、主に2つのレベルがあります。
排他ロック …… 他のユーザは、レコードの読み込みも行うことができません。UPDATE文が発行されると、自動的に生成されます。
共有ロック …… 他のユーザは、レコードを修正することはできませんが、読み込むことはできます。SELECT文によって発行されるか、またはSELECT文の終わりにFOR UPDATE句を追加することによって発行されます。共有ロックは、予定されているレコードの更新を、このロックが解放されてから実行するようにSQLサーバに指示します。レコードを更新しようとしたり、SELECT ... FOR UPDATE文を送信しようとしたりするユーザには、レコードがほかのユーザによってロックされているというエラーメッセージが表示されます。
デフォルトのロック
Magic xpaには、物理および遅延トランザクションモードの概念が導入されています。両方のモードでのMagic SQLゲートウェイのデフォルトの動作は次のとおりです。
トランザクションモード |
デフォルトの動作 |
物理 |
ODBCを除くSQLゲートウェイでは、デフォルトのロック方式として物理ロックが使用されます。 ODBCでは、トランザクションモードに関係なく、常に論理ロックが使用されます。 |
遅延 |
全てのSQLゲートウェイで、ロック方式として論理ロックが使用されます。 |
関連トピック: