我在使用TransactionScope类处理服务器端代码(WCF)时遇到了性能问题。
我的代码接收客户端请求,创建TransactionScope并执行短操作(通常不超过100毫秒)。
请参考以下附加的代码,模拟我的服务器端代码。当有100个或更多并发用户时,创建新的TransactionScope(请参见GetTransaction()方法)需要超过1秒钟时间!
并且当并发用户数达到200时,会抛出TransactionAborted异常。
你有什么想法吗?
我的代码接收客户端请求,创建TransactionScope并执行短操作(通常不超过100毫秒)。
请参考以下附加的代码,模拟我的服务器端代码。当有100个或更多并发用户时,创建新的TransactionScope(请参见GetTransaction()方法)需要超过1秒钟时间!
并且当并发用户数达到200时,会抛出TransactionAborted异常。
你有什么想法吗?
class Program
{
private static ConcurrentQueue<double> m_Queue = new ConcurrentQueue<double>();
static void Main(string[] args)
{
Console.WriteLine("Press any key to start ...");
Console.ReadKey();
for (int i = 0; i < 100; i++)
{
Thread t = new Thread(new ThreadStart(Method));
t.IsBackground = true;
t.Start();
}
Thread.Sleep(2000);
Console.WriteLine("Max {0}, Min {1}, Avg {2}, Total {3}", m_Queue.Max(), m_Queue.Min(), m_Queue.Average(), m_Queue.Count);
Console.ReadKey();
}
private static void Method()
{
using (TransactionScope scope = GetTransaction())
{
Thread.Sleep(100);
scope.Complete();
}
}
public static TransactionScope GetTransaction()
{
var start = DateTime.Now;
TransactionOptions options = new TransactionOptions();
options.IsolationLevel = IsolationLevel.ReadCommitted;
var t = new TransactionScope(TransactionScopeOption.Required, options);
// Log creation time
m_Queue.Enqueue((DateTime.Now.Subtract(start)).TotalMilliseconds);
return t;
}
}