【发布时间】:2018-01-04 17:16:04
【问题描述】:
我正在使用带有 MySql 数据库的 Asp.NET。
申请流程:
- 在 Woocommerce 中创建的订单并发送到我的应用程序
- 我的应用程序将 woo 订单对象转换为要添加到外部 ERP 系统的对象
- 在外部 ERP 系统中创建订单,我们使用该订单信息更新本地数据库,以了解创建成功
我有一段关键的代码可以在外部 ERP 资源上创建订单。同一订单的多个请求可以同时运行,因为它们是从我无法控制的外部应用程序 (woocommerce) 创建的。因此,代码的关键部分必须一次只允许输入一个请求,否则可能会创建重复订单。
重要提示:应用程序托管在具有负载均衡器的 Elastic Beanstalk 上,因此应用程序可以跨多个服务器扩展,这使得标准 C# 锁定对象不起作用。
我想创建一个可以在多个服务器/应用程序实例之间共享的锁,以便一次只有一个服务器可以获取锁并进入代码的关键部分。我找不到如何使用 MySql 和 C# 来做到这一点,所以如果有人有一个很好的例子。
以下是我如何进行单实例线程安全锁定。如何将其转换为跨多个实例的安全:
SalesOrder newOrder = new SalesOrder(); //the external order object
var databaseOrder = new SalesOrderEntity(); //local MySql database object
/*
* Make this section thread safe so multiple threads can't try to create
* orders at the same time
*/
lock (orderLock)
{
//check if the order is already locked or created.
//wooOrder comes from external order creation application (WooCommerce)
databaseOrder = GetSalesOrderMySqlDatabase(wooOrder.id.ToString(), originStore);
if (databaseOrder.OrderNbr != null)
{
//the order is already created externally because it has an order number
return 1;
}
if (databaseOrder.Locked)
{
//the order is currently locked and being created
return 2;
}
//the order is not locked so lock it before we attempt to create externally
databaseOrder.Locked = true;
UpdateSalesOrderDatabase(databaseOrder);
//Create a sales order in external system with the specified values
newOrder = (SalesOrder) client.Put(orderToBeCreated);
//Update the order in our own database so we know it's created in external ERP system
UpdateExternalSalesOrderToDatabase(newOrder);
}
如果需要更多详细信息,请告诉我。
【问题讨论】:
-
您是否只有一台服务器作为数据库服务器?或者您是否也在对数据库服务器进行负载平衡?
-
数据库是单实例。好问题
标签: c# mysql multithreading transactions