积极答复者
事务回滚时的内存问题

问题
-
数据库里有表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)中接口的简单性,又能够在事务失败时即时回滚内存?
答案
-
这个可以用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.- 已标记为答案 Allen Chen - MSFTModerator 2009年6月15日 2:56
全部回复
-
你好,
>(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. -
这个可以用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.- 已标记为答案 Allen Chen - MSFTModerator 2009年6月15日 2:56