1

我在 WCF 服务中使用事务时遇到问题。我希望我的应用程序表现得像这样:客户端开始编辑一些放在数据库中的数据。在他按下“编辑”按钮后,交易开始并持续到他结束编辑并按下“接受”按钮。然后交易结束。问题是当他没有按“接受”并退出应用程序时。事务仍在进行中,唯一合理的解决方案是设置事务超时。我应该在哪里放置有关超时的信息以使服务知道事务必须在一段时间后完成?

我尝试添加一个属性[ServiceBehavior(TransactionTimeout="00:01:00")],但之后客户端无法访问服务。添加<machineTimeout "00:01:00">到 app.config 以同样的方式结束......

详细留言:

下载 ' 时出错http://127.0.0.1:8732/Design_Time_Address/WebService/BSService/?wsdl'。无法连接到远程服务器 无法建立连接,因为目标计算机主动拒绝它127.0.0.1:8732元数据包含无法解析的引用:“ http://127.0.0.1:8732/Design_Time_Address/WebService/BSService/?wsdl”没有在“ http://127.0.0.1:8732/Design_Time_Address/WebService/BSService/?wsdl”处侦听可以接受消息的端点。这通常是由不正确的地址或 SOAP 操作引起的。无法连接到远程服务器。

4

2 回答 2

0

mTransactionConnection、mTransaction 和 mTransactionSQLCommand 是类中的私有属性,打开连接、启动事务、执行工作、提交/回滚、关闭事务。但是这个对象的实例必须存在于整个事务中。

     Public Function StartTransaction() As Boolean
        Dim result As Boolean = False

        mTransactionConnection = New SqlConnection(_ConnectionString)
        mTransactionConnection.Open()
        mTransaction = mTransactionConnection.BeginTransaction()

        result = True

        Return result

    End Function

    Public Function RunSQL(ByVal strSQL As String) As Integer

        Dim intReturn As Integer = 0

        Dim objSQLConnection As SqlConnection
        Dim objSQLCommand As SqlCommand

        objSQLConnection = New SqlConnection(_ConnectionString)
        objSQLCommand = New SqlCommand(strSQL, objSQLConnection)

        objSQLCommand.CommandType = CommandType.Text
        objSQLCommand.CommandTimeout = intCommandTimeOut

        'set  params

        objSQLConnection.Open()

        'execute SQL
        intReturn = objSQLCommand.ExecuteNonQuery()

        objSQLCommand.Dispose()

        objSQLConnection.Close()

        return intReturn

    End Function

    Public Sub CommitTransaction()

        mTransaction.Commit()

    End Sub

    Public Sub RollbackTransaction()

        mTransaction.Rollback()

    End Sub

    Public Sub CloseTransaction()

        mTransaction.Dispose()

        mTransactionConnection.Close()

        mTransaction = Nothing
        mTransactionConnection = Nothing

    End Sub
于 2012-12-11T12:20:04.593 回答
0

我们保持 WCF 事务相当简单。我们为各个表创建了单独的创建/修改方法。然后我们在启动事务的服务中添加了一个“复合”函数(使用 db 命令),插入/更新单个表,然后提交或回滚事务。交易结果由客户报告。

这允许客户端收集数据并应用业务规则,调用服务中的事务函数使用数据库内置的事务处理来完成真正的数据库事务工作。

只是一个想法。

于 2012-12-10T12:14:35.993 回答