Redigera

Dela via


Supporting Transactions in OLE DB

A transaction is a way to group, or batch, a series of updates to a data source so that either all succeed and are committed at once or (if any one of them fails) none are committed and the entire transaction is rolled back. This process ensures the integrity of the result on the data source.

OLE DB supports transactions with the following three methods:

Relationship of Sessions and Transactions

A single data source object can create one or more session objects, each of which can be inside or outside the scope of a transaction at a given time.

When a session doesn't enter a transaction, all work done within that session on the data store is immediately committed on each method call. (This is sometimes referred to as autocommit mode or implicit mode.)

When a session enters a transaction, all work done within that session on the data store is part of that transaction and is committed or aborted as a single unit. (This is sometimes referred to as manual-commit mode.)

Transaction support is provider-specific. If the provider you're using supports transactions, a session object that supports ITransaction and ITransactionLocal can enter a (non-nested) transaction. The OLE DB Templates class CSession supports these interfaces and is the recommended way to implement transaction support in Visual C++.

Starting and Ending the Transaction

You call the StartTransaction, Commit, and Abort methods in the rowset object in the consumer.

Calling ITransactionLocal::StartTransaction starts a new local transaction. When you start the transaction, any changes mandated by later operations aren't applied to the data store until you commit the transaction.

Calling ITransaction::Commit or ITransaction::Abort ends the transaction. Commit causes all changes within the scope of the transaction to be applied to the data store. Abort causes all changes within the scope of the transaction to be canceled and the data store is left in the state it had before the transaction started.

Nested Transactions

A nested transaction occurs when you start a new local transaction when an active transaction already exists on the session. The new transaction is started as a nested transaction below the current transaction. If the provider doesn't support nested transactions, calling StartTransaction when there's already an active transaction on the session returns XACT_E_XTIONEXISTS.

Distributed Transactions

A distributed transaction is a transaction that updates distributed data; that is, data on more than one networked computer system. If you want to support transactions over a distributed system, you should use the .NET Framework rather than the OLE DB transaction support.

See also

Using Accessors