Whether storage objects are transacted on the data source depends on the DBPROP_TRANSACTEDOBJECT property, which can be set on a per-column basis. If the value of this property is VARIANT_TRUE, then any storage object created on the column is transacted. That is, when a consumer calls ITransaction::Commit and the provider commits all data visible to the rowset, this includes data made visible to the rowset through storage objects. When a consumer calls ITransaction::Abort and the provider rolls back all data visible to the rowset, this includes data made visible to the rowset through storage objects. For information about what data in storage objects is visible to the rowset, see "Storage Objects and Rowset Update Semantics" earlier in this chapter.
Whether uncommitted data in transacted storage objects remains valid and whether the storage objects themselves remain valid when the transaction is committed or aborted depends on the retaining flag (fRetaining) used in the call to Commit or Abort. The retaining flag set to TRUE implicitly begins a new unit of work. If a commit is retaining, then the storage objects and any uncommitted data in them remain valid. If an abort is retaining, then the storage objects remain valid, but any uncommitted data in them is lost; furthermore, the provider must synchronize the object with its state in the data source after the transaction was aborted there. If the rowset is not preserved after a commit or abort, then the storage objects enter zombie states and any uncommitted data in them is lost; the consumer can only call Release on such objects—all other methods return E_UNEXPECTED. Whether the rowset is preserved depends on the DBPROP_COMMITPRESERVE and DBPROP_ABORTPRESERVE properties. For more information on committing and aborting a transaction, see “Transaction Objects” in Chapter 12, “Transactions.”
If the value of DBPROP_TRANSACTEDOBJECT is VARIANT_FALSE, then any storage object created on the column is not transacted. That is, all changes to the storage object are permanent once they are made visible to the data source. Whether a nontransacted storage object remains valid after Commit or Abort is called depends on the implementation of the rowset and the object itself.