トランザクション
This feature is not supported on the Wolfram Cloud.

データベースの操作によっては,データベースコマンドの列を実行する必要があることがある.例えば2つの異なる表の情報を更新する場合等である.このようなときは,一つの更新を実行したら,もう一つも実行することが大変重要であることがある.一つしか更新しないと,データに不整合が生じる可能性がありからである.すべての操作が実行されるようにするには,データベーストランザクションが利用できる.また,操作の列の途中から戻るときにもトランザクションが使える.このチュートリアルでは,トランザクションの使い方について取り上げます.

このチュートリアルの例を実際に試してみて,記載の通りに動作しなかった場合は,「データベースの例の使用」で述べているようにパッケージを使ってデータベースをもとの状態に戻す必要があるかもしれない.

SQLBeginTransaction[conn] SQLトランザクションを開始する
SQLCommitTransaction[conn]SQLトランザクションを永久にデータベースにコミットする
SQLRollbackTransaction[conn]SQLトランザクションを終了する(データベースは変更しない)

SQLトランザクションを実行する関数

まずDatabaseLink をロードし, demoデータベースに接続する.

In[28]:=
Click for copyable input

テスト用の表を作る.

In[30]:=
Click for copyable input

SQLSelectを使って表TESTのデータを見る.行が1行ある.

In[7]:=
Click for copyable input
Out[7]//TableForm=

SQLBeginTransactionでトランザクションを開始する.

In[8]:=
Click for copyable input

2種類の挿入操作を実行する.

In[9]:=
Click for copyable input

2行挿入されたことが分かる.

In[11]:=
Click for copyable input
Out[11]//TableForm=

SQLRollbackTransactionを使うと,データベースはトランザクションが始まる前の状態に戻る.挿入された2行はもうない.

In[12]:=
Click for copyable input
Out[12]//TableForm=

トランザクションはロールバックしたら閉じる.他のトランザクションが必要な場合は,新しいトランザクションを開始しなければならない.次の例では新しいトランザクションを開始し,2行挿入する.

In[14]:=
Click for copyable input

SQLCommitTransactionを使ってデータを永久にコミットする.

In[17]:=
Click for copyable input
Out[17]//TableForm=

トランザクションはコミットしたら閉じる.他のトランザクションが要求されたら,新しいトランザクションを開始しなければならない.一度トランザクションがコミットされたら,その後はロールバックできない.トランザクションはSQLSavepointを使って分割することができる.これにより,ロールバックで特定のセーブポイントまで戻ることができる.

次の例はトランザクションを開始し,データをいくつか挿入する.

In[19]:=
Click for copyable input

セーブポイントを作る.

In[20]:=
Click for copyable input
Out[20]=

データベースにさらにいくつかのデータを挿入する.

In[22]:=
Click for copyable input
Out[22]//TableForm=

SQLRollbackTransactionを使ってトランザクションをロールバックし,セーブポイントに戻る.

In[24]:=
Click for copyable input

最後の挿入は反映されていない.

In[25]:=
Click for copyable input
Out[25]//TableForm=

表TESTを削除し,接続を閉じる.

In[26]:=
Click for copyable input

トランザクションの分離

複数の並列なユーザがいる場合にデータベースのトランザクションについて作業を行うと,データの読取りに関するさまざまな問題が生じる.これらの問題は「ダーティリード」,「反復不能読取り」,「ファントムリード」として知られている.これらの問題には2つの解決策がある.一つはトランザクションを分離するようにデータベース接続オプションを設定するというもので,もう一つはタイムスタンプの確認等,データについて別の確認を行うものである.どちらの方法も長所と短所がある.例えばデータベースオプションを設定すると,データベースの並列使用時のパフォーマンスを劣化させることがある.

これらの方法の実際の詳細はこのドキュメントの範囲外であるが,DatabaseLink にはトランザクションの分離の手助けとなる接続オプションを設定する方法がたくさんある.これはOpenSQLConnectionオプションで行う.このオプションはSetOptionsを使って既存の接続について設定することもできる.

設定
詳細
ReadUncommitted分離なし
ReadCommittedダーティリードを防ぐ
RepeatableReadダーティリードと反復不能読取りを防ぐ
Serializableダーティリード,反復不能読取り,ファントムリードを防ぐ

オプションの設定