背景描述,一个商城网站,一个订单支付方案有多个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 } }