使用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秒。如果表被锁定,如何在指定的时间间隔内使事务超时?
答案 0 :(得分:0)
你可以使用带有NOWAIT的插入来立即将控制权交还给你,如果它被锁定并在你的代码中处理它。
答案 1 :(得分:0)
这是我在这种情况下必须做的事情。我发现我的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来确保资源没有被锁定。