Sql server TransactionScope内的SQLtransactions
我在transactionscope中有一个sql事务,该事务正在执行提交或回滚。但是从我读到的内容来看,提交/回滚没有任何意义,因为它是由transactionscope控制的。但是,如果我将事务对象保留在dosomething方法中,而没有提交或回滚,那么我的webservice方法(正在保存到数据库中)将无法工作,因为单个事务对象已获得锁。有人能解释一下这是怎么可能的吗?或者这是通常的行为,如果是,为什么Sql server TransactionScope内的SQLtransactions,sql-server,vb.net,tsql,transactions,sqltransaction,Sql Server,Vb.net,Tsql,Transactions,Sqltransaction,我在transactionscope中有一个sql事务,该事务正在执行提交或回滚。但是从我读到的内容来看,提交/回滚没有任何意义,因为它是由transactionscope控制的。但是,如果我将事务对象保留在dosomething方法中,而没有提交或回滚,那么我的webservice方法(正在保存到数据库中)将无法工作,因为单个事务对象已获得锁。有人能解释一下这是怎么可能的吗?或者这是通常的行为,如果是,为什么 public sub test() Using ts As New Trans
public sub test()
Using ts As New TransactionScope()
Save_CustomerDetails()
Save_AddressDetails()
'cannot show the code for security reasons
CallToWebServiceFunctionWhichSavesTheDataInDatabase()
ts.Complete()
End Using
end sub
Private Sub Save_CustomerDetails()
Dim ExistingData As DataSet
Dim DB_CustomerDetails As New CustomerDetails(objDBconn.Connection, objDBconn.Transaction)
Try
ExistingData = DB_CustomerDetails.CustomerDetails_Set()
If DB_CustomerDetails.ReturnCode<> 0 Then
Throw New ReturnException(DB_CustomerDetails.ReturnCode)
End If
Catch lex As ReturnException
JavaOnload = lex.AlertMessage
Throw
Finally
DB_CustomerDetails = Nothing
If Not(objDBCommon Is Nothing) Then
objDBCommon.CleanUp()
End If
End Try
End Sub
Public Sub Save_AddressDetails()
Dim DB_AddressDetails As New AddressDetails(objDBCommon.Connection, objDBCommon.Transaction)
Try
ExistingData = DB_AddressDetails.AddressDetails_Set()
If DB_AddressDetails.ReturnCode<> 0 Then
Throw New ReturnException(DB_AddressDetails.ReturnCode)
End If
Catch lex As ReturnException
JavaOnload = lex.AlertMessage
Throw
Catch lex As System.Exception
Throw
Finally
DB_AddressDetails = Nothing
End Try
End Sub
Function CustomerDetails_Set(Optional ByVal inFunction As String = "")
Dim Params() As SqlClient.SqlParameter
Try
Parameters.Clear()
Params = MyBase.GetParameters(Me.Connection, "sprCustomerDetails_Modify", True)
AddParam(Parameters, Params(0), ParameterDirection.ReturnValue)
AddParam(Parameters, Params(1), ParameterDirection.Input, inFunction)
AddParam(Parameters, Params(2), ParameterDirection.Input, m_Customer_ID)
MyBase.CommandType = CommandType.StoredProcedure
MyBase.CommandText = "sprCustomerDetails_Modify"
MyBase.Transaction = Me.Transaction
MyBase.Connection = Me.Connection
MyBase.Load(m_oDS)
ReturnCode = Parameters.Item(0).Value
Return m_oDS
Catch ex As SqlClient.SqlException
If ex.Number = eReturnCodes.SaveSinceLastUpdate Then
ReturnCode = ex.Number
Else
Throw
End If
Finally
End Try
End Function
Function AddressDetails_Set(Optional ByVal inFunction As String = "") As DataSet
Dim Params() As SqlClient.SqlParameter
Try
Parameters.Clear()
Params = MyBase.GetParameters(Me.Connection, "sprAddressDetails_Modify", True)
AddParam(Parameters, Params(0), ParameterDirection.ReturnValue)
AddParam(Parameters, Params(1), ParameterDirection.Input, inFunction)
AddParam(Parameters, Params(2), ParameterDirection.Input, m_Customer_ID)
MyBase.CommandType = CommandType.StoredProcedure
MyBase.CommandText = "sprAddressDetails_Modify"
MyBase.Transaction = Me.Transaction
MyBase.Connection = Me.Connection
MyBase.Load(m_oDS)
ReturnCode = Parameters.Item(0).Value
Return m_oDS
Catch ex As SqlClient.SqlException
If ex.Number = eReturnCodes.SaveSinceLastUpdate Then
ReturnCode = ex.Number
Else
Throw
End If
Catch ex As System.Exception
Throw
Finally
End Try
End Function
Protected Overridable Function GetParameters(ByRef inConnection As SqlClient.SqlConnection _
, ByVal inStoredProcedureName As String _
, ByVal inIncludeReturnValue As Boolean) As SqlClient.SqlParameter()
Return SqlHelperParameterCache.GetSpParameterSet(inConnection, inStoredProcedureName, inIncludeReturnValue)
End Function
Public Sub CleanUp()
Try
If Not Me.Transaction Is Nothing Then
If m_ReturnCode< 0 Then
Try
Me.Transaction.Rollback()
Catch ex As Exception
End Try
Else
Try
Me.Transaction.Commit()
Catch ex As Exception
End Try
End If
End If
If Me.Connection.State = ConnectionState.Open Then
Me.Connection.Close()
End If
Catch ex As Exception
Finally
If Not Me.Transaction Is Nothing Then
Me.Transaction.Dispose()
Me.Transaction = Nothing
End If
If Not Me.Connection Is Nothing Then
Me.Connection.Dispose()
Me.Connection = Nothing
End If
End Try
End Sub
公共子测试()
将ts用作新的TransactionScope()
保存客户详细信息()
保存地址详细信息()
'由于安全原因,无法显示代码
CallToWebService函数,用于将数据保存到数据库()中
ts.完成()
终端使用
端接头
私有子存储_CustomerDetails()
将现有数据设置为数据集
Dim DB_CustomerDetails作为新CustomerDetails(objDBconn.Connection,objDBconn.Transaction)
尝试
ExistingData=DB_CustomerDetails.CustomerDetails_Set()
如果DB_CustomerDetails.ReturnCode为0,则
抛出新的ReturnException(DB_CustomerDetails.ReturnCode)
如果结束
将lex捕获为ReturnException
JavaOnload=lex.AlertMessage
扔
最后
DB_CustomerDetails=无
如果不是(objDBCommon什么都不是),那么
objDBCommon.CleanUp()
如果结束
结束尝试
端接头
公共子存储地址详细信息()
Dim DB_AddressDetails作为新的AddressDetails(objDBCommon.Connection,objDBCommon.Transaction)
尝试
ExistingData=DB\u AddressDetails.AddressDetails\u Set()
如果DB_AddressDetails.ReturnCode 0,则
抛出新的ReturnException(DB_AddressDetails.ReturnCode)
如果结束
将lex捕获为ReturnException
JavaOnload=lex.AlertMessage
扔
将lex捕获为系统异常
扔
最后
DB_AddressDetails=无
结束尝试
端接头
函数CustomerDetails_Set(可选ByVal inFunction As String=“”)
Dim Params()作为SqlClient.SqlParameter
尝试
参数。清除()
Params=MyBase.GetParameters(Me.Connection,“sprCustomerDetails\u Modify”,True)
AddParam(参数,参数(0),参数方向。返回值)
AddParam(参数,参数(1),参数方向。输入,inFunction)
AddParam(参数,参数(2),参数方向。输入,m_客户ID)
MyBase.CommandType=CommandType.StoredProcess
MyBase.CommandText=“sprCustomerDetails\u Modify”
MyBase.Transaction=Me.Transaction
MyBase.Connection=Me.Connection
MyBase.Load(m_oDS)
ReturnCode=参数。项(0)。值
返回m_oDS
捕获ex为SqlClient.SqlException
如果ex.Number=eReturnCodes.SaveSinceLastUpdate,则
返回代码=出厂编号
其他的
扔
如果结束
最后
结束尝试
端函数
函数AddressDetails_集(可选ByVal inFunction As String=“”)作为数据集
Dim Params()作为SqlClient.SqlParameter
尝试
参数。清除()
Params=MyBase.GetParameters(Me.Connection,“sprAddressDetails_Modify”,True)
AddParam(参数,参数(0),参数方向。返回值)
AddParam(参数,参数(1),参数方向。输入,inFunction)
AddParam(参数,参数(2),参数方向。输入,m_客户ID)
MyBase.CommandType=CommandType.StoredProcess
MyBase.CommandText=“sprAddressDetails\u Modify”
MyBase.Transaction=Me.Transaction
MyBase.Connection=Me.Connection
MyBase.Load(m_oDS)
ReturnCode=参数。项(0)。值
返回m_oDS
捕获ex为SqlClient.SqlException
如果ex.Number=eReturnCodes.SaveSinceLastUpdate,则
返回代码=出厂编号
其他的
扔
如果结束
捕获ex作为系统异常
扔
最后
结束尝试
端函数
受保护的可重写函数GetParameters(ByRef inConnection作为SqlClient.SqlConnection_
,ByVal inStoredProcedureName作为字符串_
,ByVal inIncludeReturnValue作为布尔值)作为SqlClient.SqlParameter()
返回SqlHelperParameterCache.GetSpParameterSet(在连接中,inStoredProcedureName,inIncludeReturnValue)
端函数
公共子系统清理()
尝试
如果不是我,那么交易什么都不是
如果m_ReturnCode<0,则
尝试
Me.Transaction.Rollback()
特例
结束尝试
其他的
尝试
Me.Transaction.Commit()
特例
结束尝试
如果结束
如果结束
如果Me.Connection.State=ConnectionState.Open,则
Me.Connection.Close()
如果结束
特例
最后
如果不是我,那么交易什么都不是
Me.Transaction.Dispose()
Me.Transaction=Nothing
如果结束
如果不是我,那么连接就什么都不是了
Me.Connection.Dispose()
连接=什么都没有
如果结束
结束尝试
端接头
您能告诉我们您的实际代码吗?没有定义ts
,并且在任何情况下都超出了使用范围。当我们看不到您实际在做什么时,很难给您一个答案。如果在TransactionScope
中,Transaction.Commit
在事务作用域完成之前不会实际提交。这并不意味着你不用再打电话了@JeroenMostert:如果交易失败