0

我正在编写一个WCF服务方法来更新两个表(标题和详细信息)。我需要确保操作是原子的,所以我开始了一个围绕插入的事务。

但是,由于这是一种 Web 服务方法,因此其他用户可以在使用此事务时调用相同的函数。

一个额外的信息,我正在使用一种自定义的ORM框架,它将连接存储在会话中以供重用。

当第二个 Web 方法调用进来时,我得到以下异常:

System.Data.SqlClient.SqlException (0x80131904):不允许新事务,因为会话中还有其他线程在运行。

我知道这是因为第一次调用开始的事务还没有完成。

我想了解在 Web 服务中使用数据库事务的最佳实践是什么,以及我是否可以在不必每次都创建新连接的情况下解决这种情况。

4

1 回答 1

0

好吧,听起来另一个方法调用试图使用与第一个方法相同的连接,但它没有正确释放。

您通常有一个连接池,并从 wcf 请求中获取连接,然后在完成数据库后将其返回到池中(通过调用 Close() 或 Dispose() 或类似的东西 - 取决于您的 orm),在 Web 服务调用结束之前:

-> Wcf 方法 -> 开始事务 -> 从池中获取连接 -> 工作 -> 关闭连接(返回池) -> 提交事务 -> 返回 ->

使用 session 来存储连接可能不是一个好主意,因为连接对象不能在线程之间真正共享。

于 2013-05-08T19:54:32.730 回答