none
事务回滚时的内存问题 RRS feed

  • 问题

  • 数据库里有表A,B,C,为了提升性能,在内存中缓存了A,B,C的数据,insertA,insertB,insertC代表向A,B,C插入数据,insertMA,insertMB,insertMC代表向缓存插入数据。下面2种方案:
    (1)为了保持接口的简单,将InsertM操作放到了insert中,比如调用insertA时,insertA会自动调用InsertMA。但是如果插入失败,则内存无法自动回滚。
    (2)Insert和InsertM分开调用。这可以避免内存回滚的问题(可以再所有表插入成功后在处理内存),但是这会给上层开发造成麻烦,因为每次都要调用2次插入,很不方便,而且重构时会很麻烦。

    有没有办法既保持(1)中接口的简单性,又能够在事务失败时即时回滚内存?
    2009年6月9日 1:29

答案

  • 这个可以用Transactionscope把这三条语句包起来啊。甚至可以是访问不同数据库都可以回滚。如果是不同数据库的话请查阅MSDTC的有关资料。

    Edit:你的意思似乎是在insertA和insertB中更改了内存中的datatable?我觉得如果是这个问题,那么可以采用一个简单的方法,对拥有这个方法的类加两个新方法,一个叫RollBack一个叫Commit.交给调用者决定什么时候回滚/更新内存中的数据.如果是在同一个类中那么应该不存在问题.可以在全部执行完后再更新内存里的数据.

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年6月11日 6:52
    版主

全部回复

  • 你好,

    >(1)为了保持接口的简单,将InsertM操作放到了insert中,比如调用insertA时,insertA会自动调用InsertMA。但是如果插入失败,则内存无法自动回滚。

    你的意思是InsertMA失败的话事务不能回滚是吗?使用transactionscope的话如果有异常抛出就会回滚的啊。你是怎么做的呢?
    http://msdn.microsoft.com/en-us/library/system.transactions.transactionscope.aspx
    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年6月11日 3:34
    版主
  • 不是事务不能回滚。举个例子:
    function Add(){
    insertA(); --添加数据到数据库A并添加到内存
    insertB();
    insertC();
    }

    如果insertC()失败,添加到A,B的数据将回滚,但是,A,B添加到内存的数据还存在。我的意思即是,有没有办法让A,B在内存中的数据在天加失败时,也自动回滚。
    2009年6月11日 6:26
  • 这个可以用Transactionscope把这三条语句包起来啊。甚至可以是访问不同数据库都可以回滚。如果是不同数据库的话请查阅MSDTC的有关资料。

    Edit:你的意思似乎是在insertA和insertB中更改了内存中的datatable?我觉得如果是这个问题,那么可以采用一个简单的方法,对拥有这个方法的类加两个新方法,一个叫RollBack一个叫Commit.交给调用者决定什么时候回滚/更新内存中的数据.如果是在同一个类中那么应该不存在问题.可以在全部执行完后再更新内存里的数据.

    Please remember to mark the replies as answers if they help and unmark them if they provide no help.
    2009年6月11日 6:52
    版主