使用Oracle 11g数据库。我有一个服务,它的标签是:
ServiceBehavior(InstanceContextMode = InstanceContextMode.PerCall,TransactionTimeout="00:00:10")
该方法本身如下所示:
[OperationBehavior(TransactionScopeRequired = true)]
[TransactionFlow(TransactionFlowOption.NotAllowed)]
public OrderMessage AddOrder(OrderMessage orderMessage)
{
ValidateMessage(orderMessage);
return this.orderBusiness.Add(orderMessage);
}如果我在orderBusiness.Add方法中设置一个断点并等待10秒,事务就会超时。如果我取出断点,然后锁定事务中涉及的一个表,它将等待超过10秒,至少要等到服务在60秒超时。如果表被锁定,如何让事务在指定的时间间隔超时?
发布于 2009-05-19 14:44:50
这是我在这种情况下必须做的事情。我发现我的transactiontimeout没有效果,因为我正在等待我的事务的锁。我并不知道这一点,因为在我的数据库中,distributed_lock_timeout被设置为默认的60秒,而在此之前服务就超时了。因为我无法更改distributed_lock_timeout,所以我增加了服务超时,然后我开始看到:
InnerException: Oracle.DataAccess.Client.OracleException
Message="ORA-02049: timeout: distributed transaction waiting for lock"因此,总而言之,当我有一个断点时,transactiontimeout就起作用了,因为它关心事务实际执行需要多长时间。当表被锁定时,它没有效果,因为它还没有开始执行。在开始事务性工作之前,我应该使用try catch来确保资源没有被锁定。
发布于 2009-05-19 00:14:22
您可以使用带有NOWAIT的insert来立即将控制权返回给您,并在您的代码中处理它。
https://stackoverflow.com/questions/878183
复制相似问题