我有几个方法 - 几个调用SQL Server和一些业务逻辑来生成一个唯一的值。这些方法都包含一个父类的方法里面:为什么不隔离这个交易?
GenerateUniqueValue()
{
//1. Call to db for last value
//2. Business logic to create new value
//3. Update db with new value created
}
我想调用GenerateUniqueValue被隔离,即 - 当两个客户端同时调用它,第二个客户必须等待第一个完成。
最初,我让我的服务单身;然而,我必须预测未来可能包括负载平衡的变化,所以我相信单一方法已经失效。接下来,我决定通过装饰我的服务来试图交易方式:
[ServiceBehavior(TransactionIsolationLevel = IsolationLevel.Serializable, TransactionTimeout = "00:00:30")]
而且我GenerateUniqueValue有:
[OperationBehavior(TransactionScopeRequired = true)]
的问题是,同时命中一个错误的服务方法结果的测试:
"System.ServiceModel.ProtocolException: The transaction under which this method call was executing was asynchronously aborted."
这里是我的客户端测试代码:
private static void Main(string[] args)
{
List<Client> clients = new List<Client>();
for (int i = 1; i < 20; i++)
{
clients.Add(new Client());
}
foreach (var client in clients)
{
Thread thread = new Thread(new ThreadStart(client.GenerateUniqueValue));
thread.Start();
}
Console.ReadLine();
}
如果事务被认为是孤立的,为什么多个线程调用方法冲突?