【发布时间】:2012-10-20 23:49:30
【问题描述】:
我已经实现了一个通用存储库,想知道是否有一种聪明的方法可以在死锁异常的情况下实现重试逻辑?
所有存储库方法的方法应该相同。那么,无论如何我可以避免在每个方法中都写“try/catch - call method again with retry-count”吗?
欢迎提出任何建议。
一些我的存储库代码:
public class GenericRepository : IRepository
{
private ObjectContext _context;
public List<TEntity> ExecuteStoreQuery<TEntity>(string commandText, params object[] parameters) where TEntity : class
{
List<TEntity> myList = new List<TEntity>();
var groupData = _context.ExecuteStoreQuery<TEntity>(commandText, parameters);
return myList;
}
public IQueryable<TEntity> GetQuery<TEntity>() where TEntity : class
{
var entityName = GetEntityName<TEntity>();
return _context.CreateQuery<TEntity>(entityName);
}
public IEnumerable<TEntity> GetAll<TEntity>() where TEntity : class
{
return GetQuery<TEntity>().AsEnumerable();
}
编辑:
1.解决方法:
稍微修改 chris.house.00的解决方案
public static T DeadlockRetryHelper<T>(Func<T> repositoryMethod, int maxRetries)
{
var retryCount = 0;
while (retryCount < maxRetries)
{
try
{
return repositoryMethod();
}
catch (System.Data.SqlClient.SqlException ex)
{
if (ex.Number == 1205)// Deadlock
retryCount++;
else
throw;
}
}
return default(T);
}
你这样称呼它:
public TEntity FirstOrDefault<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
{
return RetryUtility.DeadlockRetryHelper<TEntity>( () =>p_FirstOrDefault<TEntity>(predicate), 3);
}
protected TEntity p_FirstOrDefault<TEntity>(Expression<Func<TEntity, bool>> predicate) where TEntity : class
{
return GetQuery<TEntity>().FirstOrDefault<TEntity>(predicate);
}
【问题讨论】:
-
try 语句有什么问题?
-
我认为 OP 希望避免在每个 repo 方法中重复 try...catch 块。
-
确保您的存储库可以处理死锁重试可能很困难。即使您将调用对存储库合并,每个存储库功能仍需要进行测试。
标签: c# entity-framework try-catch repository-pattern database-deadlocks