c# - 如何防止使用 EF 并发执行 SQL Server 存储过程?
问题描述
我正在使用 Entity Framework 6 Database.SqlQuery 语句来执行存储过程。我想防止两个用户同时执行相同的存储过程。
解决方案
此代码适用于同步和异步版本
private static readonly SemaphoreLocker _semaphoreLocker = new SemaphoreLocker();
public async Task<List<TResult>> ExecuteStoredProcedureWithLockAsync<TResult>(string storedProcedureName, object parameters, CancellationToken cancellationToken) where TResult : new()
{
List<TResult> result = new List<TResult>();
await _semaphoreLocker.LockAsync(async () =>
{
result = await ExecuteStoredProcedureAsync<TResult>(storedProcedureName, parameters, cancellationToken);
}, cancellationToken);
return result;
}
private Object _locker = new Object();
public List<TResult> ExecuteStoredProcedureWithLock<TResult>(string storedProcedureName, object parameters) where TResult : new()
{
lock (_locker)
{
return ExecuteStoredProcedure<TResult>(storedProcedureName, parameters);
}
}
private class SemaphoreLocker
{
private readonly SemaphoreSlim _semaphore = new SemaphoreSlim(1, 1);
public async Task LockAsync(Func<Task> worker, CancellationToken cancellationToken)
{
await _semaphore.WaitAsync(cancellationToken).ConfigureAwait(false);
try
{
await worker();
}
finally
{
_semaphore.Release();
}
}
}
推荐阅读
- java - 在“更新服务器的部署扫描程序:WildFly 23”期间发生内部错误
- python - 如何修复 VS Code 错误“invalid literal for int() with base 10”?
- reactjs - 从也可以导入的样式组件中创建全局样式的替代方法
- android - Kotlin 箭头快捷键/热键
- flutter - 在网络请求中解码表情符号
- amazon-web-services - NLB 后面的两个目标组都需要 TLS
- python - 无法在 debian 上安装 python-pubsub 客户端失败构建轮
- c++ - 设置原点百分比 SFML
- cakephp - 在不更改 sql mode=only_full_group_by 模式的情况下如何在 cakephp 中执行 group by?
- mysql - Mysqldump/MySql 避免覆盖测试人员数据库开发