DBの排他制御

EXT_SQLのTransaction

 EXT_SQL機能一部として、XCuteは、トランザクションをサポートしています。XCuteのトランザクションは、データベース固有のコマンドではなくXCute固有のもので、Transaction=Beginで開始し、Transaction=CommitTransaction=RollBackで終了するものです。
 下記は、トランザクションをORACLEで試したもので、XCuteでトランザクションを開始し、Emp表のEmpNo=100にUpDateを発行します。この状態でORACLEのSQL*Plusを開けて、同じUpdateを発行すると、SQL*PlusはEmpNo=100のレコードにはロックが掛かっているため、結果を返すことができなくなっています。

このトランザクション機能は、接続先のデータベースに依存し、ORACLEなら上記のようにレコード単位で排他が掛かり、SQLサーバではテーブルロックが掛かります。AccessのMDBでは排他制御は実質的に掛かりません。

このトランザクション機能をExcelから実行するには、R3C8以降のセルにEXT_SQLとして指定します。

ORACLEの注意点(for update):
 ORACLEでは、「SELECT * FROM TBL WHERE ... for update nowait」などとし行ロックを掛けることができますが、for update を指定したSELECT文は、WriteReportやOverWriteの中では使用しないでください。代わりにEXT_SQLとして指定してください。

XCuteで使えるTransactionコマンド
 
トランザクションについては、Transaction=Begin,Transaction=Commit,Transaction=RollBackの3つのXCute独自の命令を持ち、SQLステートメントとして指定してください。下記の表は、各データベースのテスト結果です。
DB 接続方式 XCute
独自命令
TransactionのSQLコマンド
Begin Commit RollBack
SQL Server (2019) ODBC/Native Begin Transaction Commit Transaction RollBack Transaction
Oracle (19c) ODBC/Native
DB2 (11) ODBC/Native
MySQL (5) ODBC Start Transaction Commit RollBack
PostgreSQL (9) ODBC Begin Transaction Commit Transaction RollBack Transaction


参照
 ○
リビジョン管理による排他制御
 ○各種データベース対応
 ○多国語対応(UTF-8)
 ○SQL文の指定パネル
 ○EXT_SQLコマンド


注意:Ver9まではproles.iniファイルでRollBack=1とする簡易な排他制御をサポートしていましたが、Ver10からは、上記に1本化されました。

DBの排他を使わず安全な運用を行うには

 Accessなどは上記のような排他機能はない。排他を使わなくとも、XCuteでDBを安全に運用する手法があります。
DBを参照するだけなら基本的に排他は不要で、DBを更新する時2か所から同じテーブルを更新する時排他機能が必要です。
要は、更新専用のプロジェクトを作りProweb.exeに更新用プロジェクトを1つだけ起動させることで、処理は1つずつ順番に行われます。
参照用のプロジェクトは、Proweb.exeに2つ以上起動させてもかまいません。一般に、DBの更新と参照では、圧倒的に参照が多いはずです。

参照
 ○
運用サーバについて