Вам необходимо использовать новый TxF, Transactted NTFS, представленный в Vista, Windows 7 и Windows Server 2008. Это хорошая вводная статья: Расширение возможностей ваших приложений с помощью транзакций файловой системы .Он содержит небольшой управляемый пример регистрации файловой операции в системной транзакции:
// IKernelTransaction COM Interface
[Guid("79427A2B-F895-40e0-BE79-B57DC82ED231")]
[InterfaceType(ComInterfaceType.InterfaceIsIUnknown)]
public interface IKernelTransaction
{
int GetHandle(out IntPtr pHandle);
}
[DllImport(KERNEL32,
EntryPoint = "CreateFileTransacted",
CharSet = CharSet.Unicode, SetLastError = true)]
internal static extern SafeFileHandle CreateFileTransacted(
[In] string lpFileName,
[In] NativeMethods.FileAccess dwDesiredAccess,
[In] NativeMethods.FileShare dwShareMode,
[In] IntPtr lpSecurityAttributes,
[In] NativeMethods.FileMode dwCreationDisposition,
[In] int dwFlagsAndAttributes,
[In] IntPtr hTemplateFile,
[In] KtmTransactionHandle hTransaction,
[In] IntPtr pusMiniVersion,
[In] IntPtr pExtendedParameter);
....
using (TransactionScope scope = new TransactionScope())
{
// Grab Kernel level transaction handle
IDtcTransaction dtcTransaction =
TransactionInterop.GetDtcTransaction(managedTransaction);
IKernelTransaction ktmInterface = (IKernelTransaction)dtcTransaction;
IntPtr ktmTxHandle;
ktmInterface.GetHandle(out ktmTxHandle);
// Grab transacted file handle
SafeFileHandle hFile = NativeMethods.CreateFileTransacted(
path, internalAccess, internalShare, IntPtr.Zero,
internalMode, 0, IntPtr.Zero, ktmTxHandle,
IntPtr.Zero, IntPtr.Zero);
... // Work with file (e.g. passing hFile to StreamWriter constructor)
// Close handles
}
Вам необходимо зарегистрировать свою SQL-операцию в той же транзакции, которая будет автоматически выполняться в TransactionScope.Но я настоятельно рекомендую переопределить параметры TransactionScope по умолчанию , чтобы использовать уровень изоляции ReadCommitted:
using (TransactionScope scope = new TransactionScope(
TransactionScope.Required,
new TransactionOptions
{ IsolationLevel = IsolationLEvel.ReadCommitted}))
{
...
}
Без этого вы получите уровень изоляции Serializable по умолчанию, который является слишком избыточным длябольшинство случаев.