私たちは、人々がギフトカードを購入できるeコマースのウェブサイトを持っています。これらのカードは、ロジスティック目的でテーブルに格納され、整数で順序付けされています。誰かがギフトカードを購入した場合、データベースに購入注文を挿入し、最初の適格なカードのフィールドを編集して、もう使用できなくなったことを知ります。閲覧用ロックテーブル
しかし、2人のユーザーが同じ時間にカードを購入した場合、同じカードが両方のカードに与えられることがあります。そこで私たちはIsolationLevel.ReadCommitted
との取引をしましたが、これはうまくいきません。同時クリック数が4回の場合は、2 PurchaseOrder
の場合はCard
、2 PurchaseOrder
の場合はCard
となります。
TransactionOptions transOption = new TransactionOptions();
transOption.IsolationLevel = IsolationLevel.ReadCommitted;
using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Required, transOption))
{
PurchaseOrder purchaseOrder = GetFull(request.OrderId);
purchaseOrder.ChangeTracker.ChangeTrackingEnabled = true;
purchaseOrder.IdStatus = DbConstants.RefPurchaseOrderStatus.Completed;
//select the quantity of purchased gift cards and update them with ObjectContext.SaveChanges()
List<Card> cards = _cardBusiness.AssignCards(purchaseOrder.Quantity, purchaseOrder.IdProduct, purchaseOrder.IdUserAccount, purchaseOrder.IdChannel);
Card[] arrCards = cards.ToArray();
int count = 0;
//Set a link between a PurchaseOrder Line and the Card
foreach(PurchaseOrderLine line in purchaseOrder.PurchaseOrderLines)
{
line.ChangeTracker.ChangeTrackingEnabled = true;
line.IdCard = arrCards[count].Id;
count++;
}
PurchaseOrder po = Update(purchaseOrder);
scope.Complete();
return true;
}
クイックコメント:トランザクションでは、我々はいくつかのプロパティを編集し、利用できるギフトカード(複数可)を選択し、そのステータスを変更し、以前に挿入PurchaseOrder
を取得し、SaveChanges()
とリンクにギフトカード(複数可)を返しますPurchaseOrderLine
に
しかし、私たちは明らかにカード選択をロックしていません。どうしたらいい?
更新:
public static List<Card> AssignCards(int qty, int idProduct, Guid idUserAccount, int? idChannel)
{
using (RestopolitanEntities context = GetContext())
{
try
{
var Xcards = (from c in context.Cards
select c);
List<Card> cards = Xcards.OrderBy(c => c.IdOrder).Take(qty).ToList();
foreach (Card card in cards)
{
card.ChangeTracker.ChangeTrackingEnabled = true;
card.UseDate = DateTime.Now;
}
context.SaveChanges();
return cards.ToList();
}
catch (Exception ex)
{
HandleException(ex);
}
}
return null;
}
私はIsolationLevel.RepeatableRead
てみました、Card
は長い2 PurchaseOrder
に起因していません。ただしAssignCards()
からはCard
が返されません。同時クリック数が4の場合、Card
を含まないCard
と2 PurchaseOrder
を区別する2つのPurchaseOrder
があります。
AssignCards()とは何ですか?このメソッドのコードを追加できますか? – MikkaRin
おそらく、あなたはすでに使用されている番号を取得しないようにdbが注意を払うので、データベースシーケンスでソリューションを作成することができます... – DatRid
どのデータベースプラットフォームを使用していますか? – mjwills