多個操作如何返回到Try前狀態。希望大家有可行方案,lolock using ...
static void Main(string[] args)
{
Product A = new Product(10);
Product B = new Product(10);
try
{
A.Qty -= 10;
B.Qty -= 20;
}
catch (Exception)
{
//A.Qty += 10; How to RollBack
}
}
class Product
{
public Product(int q){ qty = q;}
int qty;
public int Qty {get { return qty; }
set {
if (value < 0)
{
throw new Exception("");
}
qty = value;
}
}
}
我看了半天我想你的意思应该是啥意思吧
我描述一下,看和你表达的意思是不是一致,你的意思大概是:每件商品 现在有10件,如果扣的时候,多出了现在的10件库存,或者说扣的时候,系统出现了错误,就不让它扣,就直接回滚到之前的10件。是这个意思么?
一個訂單有許多個產品,在發貨時一個個減少庫存,發現亦任何一個數量不足時保證庫存為未執行前的數量
@Kiver:明白你的意思,我现在已经给出了解决方案。你需要引入
代码如下:
不过我稍微修改了你的代码,你只需要 稍修改一下你的代码就行了
using System; using System.Collections.Generic; using System.Linq; using System.Text; using System.Threading.Tasks; using System.Transactions; namespace ConsoleApplication3 { class Program { static void Main(string[] args) { //现有商品10件 Product v = new Product(10); Product v2 = new Product(10); try { using (TransactionScope transactionScope = new TransactionScope()) { Transaction.Current.EnlistPromotableSinglePhase(v); Transaction.Current.EnlistPromotableSinglePhase(v2); v.现在设置的值 = v.现在设置的值 - 10; v2.现在设置的值 = v.现在设置的值 - 20; DoSomething(); transactionScope.Complete(); } } catch { } Console.WriteLine(v.现在设置的值); Console.WriteLine(v2.现在设置的值); } /// <summary> /// 模拟系统出现了崩溃异常 /// </summary> static void DoSomething() { throw new Exception(); } } class Product : IPromotableSinglePhaseNotification { //保存最原始的值 private int 原始的值; public Product(int q) { _现在设置的值 = q; } private int _现在设置的值; public int 现在设置的值 { get { return _现在设置的值; } set { if (value <0) { throw new Exception(""); } _现在设置的值 = value; } } public void Initialize() { 原始的值 = 现在设置的值; } public void Rollback(SinglePhaseEnlistment singlePhaseEnlistment) { this.现在设置的值 = 原始的值; singlePhaseEnlistment.Aborted(); } public void SinglePhaseCommit(SinglePhaseEnlistment singlePhaseEnlistment) { 原始的值 = this.现在设置的值; singlePhaseEnlistment.Committed(); } public byte[] Promote() { throw new TransactionException("变量事务只支持本地事务"); } } }
@Kiver:到底行不行啊…… 你倒是说句话啊……
推荐园子里的一篇博文:那些年我们一起追过的缓存写法(一)
沒看懂能不能解決我的問題,感覺lock解決的是線程問題。如果作為緩存方案,使用get set必須對等(不允許外部修改緩存對象)的操作或許是一個方法。
看不懂你的问题.缓存要保证一致性?
可以试试TransactionScope,不过这个好像也有点问题,忘了当时遇到的问题和解决方案了,可以看看这个!
缓存是没有事务的,只有持久化才有事务.有些缓存有事务,但是也不要那样用.很麻烦的
@吴瑞祥: 我咋没有看到有用缓存?
@晓菜鸟: 他上面的代码连数据库都没有.跟不用谈事务了.