使用Oracle 11g的TransactionTimeout

时间:2009-05-18 15:03:29

标签: .net wcf oracle transactions

使用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秒。如果表被锁定,如何在指定的时间间隔内使事务超时?

2 个答案:

答案 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来确保资源没有被锁定。