我想挑选您的大脑,了解如何摆脱SQL Server超时方案。为了演示目的,我有两个(自我描述的)WCF服务,UserService和AuthorizationService。在事务性WCF操作中摆脱SQL Server数据库超时
我有一个操作CREATEUSER()在UserService和AssignRole()在AuthorizationService。如果两个操作都不存在,那么这两个操作或者启动一个事务,或者如果一个事务由调用者启动,则加入事务
服务合同
[ServiceContract(Namespace="http://tempuri.org/")]
public interface IUserService
{
[OperationContract]
void CreateUser(UserData user);
}
[ServiceContract(Namespace="http://tempuri.org/")]
public interface IAuthorizationService
{
[OperationContract]
void AssignRole(UserData user, RoleData role);
}
代理:
public sealed class UserProxy : ClientBase<IUserService>, IUserService
{
void IUserService.CreateUser(UserData user)
{
Channel.CreateUser(user);
}
}
public sealed class AuthorizationProxy : ClientBase<IAuthorizationService>, IAuthorizationService
{
void IAuthorizationService.AssignRole(UserData user, RoleData role)
{
Channel.AssignRole(user, role);
}
}
实施:
public sealed class UserService : IUserService
{
[OperationBehavior(TransactionScopeRequired=true)]
void IUserService.CreateUser(UserData user)
{
// code to create user in database
IAuthorizationService authProxy = new AuthorizationProxy();
// call AuthorizationService.AssignRole to assign user a default role
authProxy.AssignRole(user, /* default role */);
}
}
public sealed class AuthorizationService: IAuthorizationService
{
[OperationBehavior(TransactionScopeRequired=true)]
void IAuthorizationService.AssignRole(UserData user, RoleData role)
{
// code to confirm that user exists (database read) => YOU GET A TIMEOUT HERE, since user created in UserService.CreateUser() has not been committed
}
}
说明:
的UserService.CreateUser()操作需要调用AuthorizationService.AssignRole()为正在创建一个用户分配一个缺省的作用。这个想法是,UserService.CreateUser()操作的成功与其成功执行和AuthorizationService.AssignRole()的绑定以分配默认角色,因此它们都是在单个事务中发生的非常重要的。
注:AuthorizationService.AssignRole()不仅从UserService.CreateUser(叫)所以它总是要执行自己的检查以确认该用户是否存在。
麻烦:当UserService.CreateUser()操作被调用时,它会启动一个事务,当它调用AuthorizationService.AssignRole()分配默认角色,操作将加入现有的交易和检查用户是否存在会导致超时,因为事务未完成并且用户未提交。
我知道一个快速和肮脏的(可能?)的方式来解决这个问题是一个布尔参数添加到AuthorizationService.AssignRole(),这样我可以用它来控制用户存在检查是否应该做的(即绕过检查,如果用户正在创建过程中),但我想听听是否有更多优雅的方法来绕过此超时方案。
对你感到羞耻!不,真的,搞清楚了。 +1 –