トランザクションの使用
トランザクションとは、データベースへの一連の変更操作を 1 つの操作単位としてまとめて処理する仕組みのことです。データベースの変更後は、その変更をコミットまたは中止できます。Microsoft® SQL Server™ 2000 Windows® CE Edition (以下、SQL Server CE) ではトランザクションがサポートされており、トランザクションを使用するための機能も公開されています。この機能は、ADOCE (Microsoft ActiveX® Data Objects for Windows CE 3.1) と OLE DB レイヤの両方を直接介して使用します。トランザクションはネストすることもできます。大きなトランザクション内には、個別にコミットしたり中止したりする極めて小さな作業単位を入れることが可能です。
SQL Server CE のトランザクション モデルは、Microsoft SQL Server のトランザクション モデルとは異なります。この両方で実行するアプリケーションを開発するするときは、以下の点に留意してください。
- SQL Server CE でサポートされるのは、単一フェーズ コミットのトランザクションのみです。
- SQL Server CE では、トランザクションを最大 5 レベルまでネストできます。
- SQL Server CE で公開されているトランザクション分離モデルは "Read Committed" です。これは SQL Server CE が、ユーザーをデータベース内のコミットされていない変更から分離できることを意味します。
- SQL Server CE では、トランザクション中に変更があったテーブルに対する排他ロックは、そのトランザクションが完了するまで保持されます。トランザクションのロックが解除されるまでは、テーブルを開いたり修正したりすることはできません。したがって、トランザクション内で DDL 操作を実行することは通常はお勧めできません。ロックの競合が発生する可能性があるからです。
- トランザクションはカーソルの機能にも影響します。SQL Server CE では、トランザクション内で開いたカーソルが、そのトランザクションの有効範囲内に存在します。トランザクションが中止されると、カーソルは存在しなくなります。トランザクションを中止してからも引き続きカーソルを使用するには、トランザクションの有効範囲外でそのカーソルを開く必要があります。これは、SQL Server CE の ADOCE と OLE DB のコンテキストでは、レコードセットがゾンビ状態になりクローズしなければならないことを意味します。トランザクションがコミットしても、カーソルは存在し、全面的に機能します。
OLE DB Provider for SQL Server CE でトランザクションを使用する方法の詳細については、「トランザクション」を参照してください。
例
次の Microsoft Visual Basic® の例では、ADOCE でトランザクションを使用しています。
Sub TransactionExample()
Dim cn As ADOCE.Connection
Dim rs As ADOCE.Recordset
Set cn = CreateObject("ADOCE.Connection.3.1")
Set rs = CreateObject("ADOCE.Recordset.3.1")
'Open a connection to a SQL Server CE database.
cn.Open "provider=Microsoft.SQLServer.OLEDB.CE.2.0;data source=\ssce.sdf;"
' Begin a transaction.
cn.BeginTrans
' Commit that transaction.
cn.CommitTrans
' Demonstrate that opening a table outside of the transaction
' avoids potential problems with DBPROP_ABORTPRESERVE.
rs.Open "helloworld", cn, adOpenDynamic, adLockOptimistic
cn.BeginTrans
cn.RollbackTrans
rs.MoveFirst ' recordset is still functional
rs.Close
' Opening a rowset within a transaction that is canceled
' will zombie the rowset. This can be accessed in ADOCE
' through the "Preserve on Abort" property.
cn.BeginTrans
rs.Open "helloworld", cn, adOpenDynamic, adLockOptimistic
Debug.Print rs.Properties("Preserve on Abort")
Debug.Print rs.State
cn.RollbackTrans
rs.MoveFirst
End Sub