如何编写一个事务,以涵盖在数据库中移动文件和插入记录
本文关键字:数据库 移动 文件 记录 插入 何编写 事务 一个 | 更新日期: 2023-09-27 18:12:49
我想有一个事务复制一个文件,然后在数据库中插入一个记录。类似下面的语句,但事务不包括复制文件。解决办法是什么?
using (TransactionScope scope1 = new TransactionScope())
{
// Copy a file
fileMgr.Move(srcFileName, destFileName);
// Insert a database record
dbMgr.ExecuteNonQuery(insertSql);
scope1.Complete();
}
尝试使用。net事务文件管理器
这个库允许您像这样将文件系统操作包装在事务中:
// Wrap a file copy and a database insert in the same transaction
TxFileManager fileMgr = new TxFileManager();
using (TransactionScope scope1 = new TransactionScope())
{
// Copy a file
fileMgr.Copy(srcFileName, destFileName);
// Insert a database record
dbMgr.ExecuteNonQuery(insertSql);
scope1.Complete();
}
新版本的Windows可以使用TxF (Transactional NTFS)。这里有一个代码示例:WINDOWS VISTA -在c#中引入TXF(第二部分)-使用系统。交易和DTC(很抱歉大写锁定,但页面标题是:-))
你必须使用MoveFileTransacted而不是DeleteFileTransactioned
。一旦您在DTC中,您的SQL连接应该被注册到其中,因此所有事情都应该是一个大事务。
请在使用transactional NTFS
或任何其他建议之前阅读本文:https://learn.microsoft.com/nl-nl/windows/desktop/FileIO/deprecation-of-txf
TxF是一组复杂而微妙的api,不常被第三方应用程序使用。考虑到这些api可能在Windows的未来版本中不可用,以及有更简单的替代方法来实现TxF开发的许多场景,微软强烈建议开发人员研究这些替代方法,而不是在他们的应用程序中创建对TxF的依赖。
实现ACID
的更好方法是使用fileststream存储
您可以手动滚入自己的文件事务,如果提交失败,则将文件移回原始位置
using (TransactionScope scope1 = new TransactionScope())
{
// Copy a file
fileMgr.Move(srcFileName, destFileName);
try
{
// Insert a database record
dbMgr.ExecuteNonQuery(insertSql);
scope1.Complete();
} catch (Exception) {
fileMgr.Move(destFileName, srcFileName);
}
}
我不是100%确定在提交事务时是否发生错误的语法,但我认为这说明了