背景描述,一个商城网站,一个订单支付方案有多个1.金额支付2.积分支付3.工资支付(分期和全额),所以一个订单的方案可能有1;有1、2,或1、2、3

状态,1.订单状态,2,支付状态==>多方案的订单有多个支付状态。

问题发现,一个订单多次支付!!!

于是分析,找解决方案。

1.DB 行锁

2.多线程控制

多线程测试参考 链接

using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading;
using System.Threading.Tasks;

namespace ConsoleThread
{
    class Program
    {
        const string firstOrderId = "001";
        const string secondOrderId = "002";
        const string thirdOrderId = "003";
        static void Main(string[] args)
        {
            test(LockType.LockObject);
            test(LockType.LockStaticObject);
            test(LockType.LockString);
            test(LockType.LockThis);
        }
        static void test(LockType lockType)
        {
            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("----------------测试相同的订单-------------------");
            Console.ForegroundColor = ConsoleColor.Green;
            OrderPay(firstOrderId, 1, lockType);
            OrderPay(firstOrderId, 2, lockType);
            OrderPay(firstOrderId, 3, lockType);

            Thread.Sleep(1000);

            Console.ForegroundColor = ConsoleColor.Yellow;
            Console.WriteLine("----------------测试不同的订单-------------------");
            Console.ForegroundColor = ConsoleColor.Green;
            OrderPay(firstOrderId, 1, lockType);
            OrderPay(secondOrderId, 1, lockType);
            OrderPay(thirdOrderId, 1, lockType);

        }

        static void OrderPay(string orderId, int threadNo, LockType lockType)
        {
            new Thread(() => new Payment(orderId, threadNo).Pay(lockType)).Start();
            Thread.Sleep(100);
        }
    }

    public class Payment
    {
        private readonly string LockString;
        private readonly int ThreadNo;
        private readonly Object LockObj = new object();
        private static readonly Object StaticLockObj = new object();

        public Payment(string orderId, int threadNo)
        {
            this.LockString = orderId;
            this.ThreadNo = threadNo;
        }

        public void Pay(LockType lockType)
        {
            ShowMessage("等待资源");
            switch (lockType)
            {
                case LockType.LockThis:
                    lock (this)
                    {
                        ShowAction();
                    }
                    break;
                case LockType.LockString:
                    lock (LockString)
                    {
                        ShowAction();
                    }
                    break;
                case LockType.LockObject:
                    lock (LockObj)
                    {
                        ShowAction();
                    }
                    break;
                case LockType.LockStaticObject:
                    lock (StaticLockObj)
                    {
                        ShowAction();
                    }
                    break;
                default:
                    break;
            }
            ShowMessage("释放资源");
        }
        private void ShowAction()
        {
            ShowMessage("进入锁并开始操作");
            Thread.Sleep(1000);
            ShowMessage("完成操作,时间" + DateTime.Now);
        }
        private void ShowMessage(string message)
        {
            Console.WriteLine(string.Format("订单{0}的第{1}个线程{2}", LockString, ThreadNo, message));
        }
    }
    public enum LockType
    {
        LockThis = 0,
        LockString = 1,
        LockObject = 2,
        LockStaticObject = 3
    }
}
View Code

相关文章: