事务超时和连接池问题

时间:2012-01-10 16:24:24

标签: vb.net transactions .net-2.0

在我维护的asp.net 2.0应用程序中,我们遇到了事务中止错误(超时)的问题。失败的代码似乎导致超时,然后使用transactionscope(默认构造函数)的页面日志记录功能失败(但并非总是如此)。超时设置为2分钟。

一些示例代码与我们在应用程序中的代码类似,如下所示:

Try

      Dim scope As TransactionScope = New TransactionScope(TransactionScopeOption.Required, New TimeSpan(0, 0, CInt(TransactionTimeout)))

    **A method call that fails is here**

     Using scope

**other code is here**


scope.complete

end using


catch

从我所看到和阅读的内容来看,我的猜测是,由于永远不会达到使用块,因此事务超时。然后,日志记录代码(完成任何页面请求)尝试在现有事务中登记,该事务已超时并导致事务中止错误(一旦调用构造函数)。这个假设是否正确?为什么只有一些请求会失败而不是全部(假设它们都使用transactioncope)?

我的大问题是连接池如何发挥作用?如果用户A遇到错误的代码,那么用户B是否会受此影响呢?这是我们看到的行为。如果没有,还有什么可能导致这个?我去过MSDN,但我找不到任何真正点击我的内容,以及发生了什么以及为什么。

以下是连接字符串的相关部分:

Enlist=true;Pooling=true;Connection Lifetime=20;Max Pool Size=25;Min Pool Size=5

FYI。不确定这是否相关,但应用程序使用带有EntLib数据库工厂模式的Oracle 11g数据库。

感谢您的帮助。

1 个答案:

答案 0 :(得分:1)

首先,如果可以,我会将您的代码更改为:

Using scope As New TransactionScope(TransactionScopeOption.Required, New TimeSpan(0, 0, CInt(TransactionTimeout)))

如果这是不可能的,那么你应该将你的代码包装在try / finally语句中,如果设置了,则将范围放在finally中。

    Dim scope As TransactionScope
    Try
        scope = New TransactionScope(TransactionScopeOption.Required, New TimeSpan(0, 0, CInt(TransactionTimeout)))

        ' **A method call that fails is here**

        ' **other code is here**
        scope.complete()
    Finally
        If scope IsNot Nothing Then
            Try
                scope.Dispose()
            Catch
            End Try
        End If
    End Try

但是,连接池可能会在超时问题中起作用。

一般来说,连接是由连接字符串池化的,因此对相同连接字符串的后续请求将导致从池中释放连接,并将相同的连接字符串(如果有)分配给请求。

当池返回连接时,它将在池中保留Connection Lifetime参数中指定的秒数,如果未重用,则将被释放。

基于此,假设您在连接字符串中有一些特定于用户的信息或其他数据因连接而异,如果您有超过25个用户在20秒的时间跨度内执行操作,您将运行超出可用的连接。

此外,如果您的应用程序保持连接打开的时间超过绝对必要的时间,或者未明确关闭已打开的连接,则连接可以保持打开的时间比预期的长。如果没有处理TransactionScope,可能就是这种情况。