none
请问下C#语言本身是否支持类似于事务的东西? RRS feed

  • 问题

  • 现有一个程序,需要删除数据库中部分数据,并且需要删除硬盘上的一些文件。要求保证两者必需都成功,否则回滚。

    请问:c#本身是否支持类似于数据库事务的东西,以完成上述操作?

    2011年4月13日 3:33

答案

  • 你好

    或者你可以參考以下URL

    SqlConnection.BeginTransaction 方法

    可以ROLL BACK TRANSACTION 的

    http://msdn.microsoft.com/zh-cn/library/86773566.aspx

    如果要做到要求保证两者必需都成功,否则回滚

    或者你可以嘗試在執行SQL 前查看這檔案是否存在...ETC 

    Please correct me if my concept is wrong


    Chi
    2011年4月13日 3:45
    版主
  • 作为一种语言,C# 只是如实,或者部分反映 .NET Framework 提供的功能而已,它本身是语法糖和语法盐的集合,也不会提供超出 .NET 之外的功能支持。

    对于 .NET,目前的操作有一些是支持原子性的。比如,Interlocked。但它的支持比较少。但是,可以预见,C# 会在未来有能力让软件支持软件事务模型 (STM, Software Transactional Model)。比如下面的代码:

    public void Test(string s) { atomic { int a = int.Parse(s); a++; return a; } }

    在 MSDN DevLab 中,有一个早期版本的 STM 库可以下载,如果您有兴趣可以去玩玩。


    Mark Zhou
    2011年4月13日 7:55
  • 你好 EasyFast

     

     

    目前 TransactionScope 只能处理数据库的事务,对于其他事务,如 I/O,目前的 .NET 版本无法处理。

     

    数据库用的是回滚日志的方法,在执行事务时,同时也将事务操作写进了日志文件,因此如果有异常发生,回滚时,如果机器断电,也会成功回滚,因为回滚依赖的操作日志还在。

     

    据我所知基于 I/O 的事务控制,模仿MSI (Windows Installer) 实现机制。它也是利用回滚日志 (*.rbf) 来实现 I/O 事务控制的。对于您的情况,在I/O操作部分,只有自己写代码控制。

    你可以使用c#的事务机制:操作的文件记录下来活者对问价进行备份,如果数据库事务成功了,再删除文件,否则就返回。


    Best Regards
    Daniel Wang [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月13日 10:36
    版主

全部回复

  • 你好

    或者你可以參考以下URL

    SqlConnection.BeginTransaction 方法

    可以ROLL BACK TRANSACTION 的

    http://msdn.microsoft.com/zh-cn/library/86773566.aspx

    如果要做到要求保证两者必需都成功,否则回滚

    或者你可以嘗試在執行SQL 前查看這檔案是否存在...ETC 

    Please correct me if my concept is wrong


    Chi
    2011年4月13日 3:45
    版主
  • 您提供的方法我也想过,但是这个只能做到回滚sql语句吧,删除文件能不能回滚。

     

    补充,可以先执行sql,然后再执行删除文件,如文件删除失败,则回滚sql。这样做虽然可以做到,但是这样的做法不适合多种操作并行,比如删除数据库记录、删除文件、修改文件、增加文件这几个操作同时进行时,这样的设计就不适应了。

     

    我需要一个能适应在事务中执行任意操作,并且一旦出错,可以进行回滚的办法。

    2011年4月13日 4:07
  • 你好!

    删除文件本身不预见的问题不多,一般情况下可以不用考虑。

    若的确需要考虑可以在删除文件时对文件去更名或 Copy到另外的目录中以备异常时恢复文件。


    知识改变命运,奋斗成就人生!
    2011年4月13日 4:55
    版主
  • ADO.NET中有事务

    代码写稳键一点就可以了


    胡超
    2011年4月13日 7:41
  • 作为一种语言,C# 只是如实,或者部分反映 .NET Framework 提供的功能而已,它本身是语法糖和语法盐的集合,也不会提供超出 .NET 之外的功能支持。

    对于 .NET,目前的操作有一些是支持原子性的。比如,Interlocked。但它的支持比较少。但是,可以预见,C# 会在未来有能力让软件支持软件事务模型 (STM, Software Transactional Model)。比如下面的代码:

    public void Test(string s) { atomic { int a = int.Parse(s); a++; return a; } }

    在 MSDN DevLab 中,有一个早期版本的 STM 库可以下载,如果您有兴趣可以去玩玩。


    Mark Zhou
    2011年4月13日 7:55
  • 你好 EasyFast

     

     

    目前 TransactionScope 只能处理数据库的事务,对于其他事务,如 I/O,目前的 .NET 版本无法处理。

     

    数据库用的是回滚日志的方法,在执行事务时,同时也将事务操作写进了日志文件,因此如果有异常发生,回滚时,如果机器断电,也会成功回滚,因为回滚依赖的操作日志还在。

     

    据我所知基于 I/O 的事务控制,模仿MSI (Windows Installer) 实现机制。它也是利用回滚日志 (*.rbf) 来实现 I/O 事务控制的。对于您的情况,在I/O操作部分,只有自己写代码控制。

    你可以使用c#的事务机制:操作的文件记录下来活者对问价进行备份,如果数据库事务成功了,再删除文件,否则就返回。


    Best Regards
    Daniel Wang [MSFT]
    MSDN Community Support | Feedback to us
    Get or Request Code Sample from Microsoft
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.

    2011年4月13日 10:36
    版主