首页 新闻 搜索 专区 学院

缓存保护机制方案

0
悬赏园豆:120 [已解决问题] 解决于 2015-10-12 08:26

多個操作如何返回到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;                

      }            

    }        

}

Kiver的主页 Kiver | 初学一级 | 园豆:24
提问于:2015-10-09 11:24
< >
分享
最佳答案
0

我看了半天我想你的意思应该是啥意思吧

我描述一下,看和你表达的意思是不是一致,你的意思大概是:每件商品 现在有10件,如果扣的时候,多出了现在的10件库存,或者说扣的时候,系统出现了错误,就不让它扣,就直接回滚到之前的10件。是这个意思么?

收获园豆:100
田麦成 | 小虾三级 |园豆:1984 | 2015-10-09 12:44

一個訂單有許多個產品,在發貨時一個個減少庫存,發現亦任何一個數量不足時保證庫存為未執行前的數量

Kiver | 园豆:24 (初学一级) | 2015-10-09 12:53

@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("变量事务只支持本地事务");
        }
    }
}
田麦成 | 园豆:1984 (小虾三级) | 2015-10-09 12:56

@Kiver:到底行不行啊…… 你倒是说句话啊……

田麦成 | 园豆:1984 (小虾三级) | 2015-10-10 09:21
其他回答(3)
0

推荐园子里的一篇博文:那些年我们一起追过的缓存写法(一)

收获园豆:10
dudu | 园豆:38814 (高人七级) | 2015-10-09 11:32

沒看懂能不能解決我的問題,感覺lock解決的是線程問題。如果作為緩存方案,使用get set必須對等(不允許外部修改緩存對象)的操作或許是一個方法。

支持(0) 反对(0) Kiver | 园豆:24 (初学一级) | 2015-10-09 12:00
0

看不懂你的问题.缓存要保证一致性?

收获园豆:5
吴瑞祥 | 园豆:28851 (高人七级) | 2015-10-09 12:29
0

可以试试TransactionScope,不过这个好像也有点问题,忘了当时遇到的问题和解决方案了,可以看看这个!

收获园豆:5
晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-10-09 16:32

缓存是没有事务的,只有持久化才有事务.有些缓存有事务,但是也不要那样用.很麻烦的

支持(0) 反对(0) 吴瑞祥 | 园豆:28851 (高人七级) | 2015-10-12 09:31

@吴瑞祥: 我咋没有看到有用缓存?

支持(0) 反对(0) 晓菜鸟 | 园豆:2594 (老鸟四级) | 2015-10-15 14:42

@晓菜鸟: 他上面的代码连数据库都没有.跟不用谈事务了.

支持(0) 反对(0) 吴瑞祥 | 园豆:28851 (高人七级) | 2015-10-15 16:03
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册