EF架构~通过EF6的DbCommand拦截器来实现数据库读写分离~续~添加事务机制

时间:2023-01-07 07:33:39

回到目录

上一讲中简单介绍了一个EF环境下通过DbCommand拦截器来实现SQLSERVER的读写分离,只是一个最简单的实现,而如果出现事务情况,还是会有一些问题的,因为在拦截器中我们手动开启了Connection链接,而在一个WEB请求时,如果你的一个变量即用到了read库又用到了write库,就会导致到sqlserver端的spid(system process id,系统进程ID,sqlserver里可能是某个数据库进程序的ID)发生变化 ,而对于这种变化,原本是本地的事务就会自动提升为分布式事务,对MSDTC不了解的同学,可能看我的相关文章,所以,我们使用拦截实现读写分离后,在程序里,你的读和写的仓储对象要分别定义,不能共享,而且,你在事务里所以写的仓储对象都要使用同一个数据上下文!

当你按着我说的做后,本地事务就不会提升为msdtc了,如图:

aaarticlea/png;base64,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" alt="" />

今天我在DbCommand拦截器进行了优化,下面共享一下代码,如是测试不是真实一项目代码

    /// <summary>
/// SQL命令拦截器
/// </summary>
public class SqlCommandInterceptor : DbCommandInterceptor
{
/// <summary>
/// 读库,从库集群,写库不用设置走默认的EF框架
/// </summary>
string readConn = System.Configuration.ConfigurationManager.AppSettings["readDb"] ?? string.Empty;
private string GetReadConn()
{
var readArr = readConn.Split(new char[] { ',' }, StringSplitOptions.RemoveEmptyEntries);
var resultConn = string.Empty;
if (readArr != null && readArr.Any())
{
resultConn = readArr[Convert.ToInt32(Math.Floor((double)new Random().Next(, readArr.Length)))];
}
return resultConn;
}
//linq to entity生成的update,delete
public override void NonQueryExecuting(DbCommand command, DbCommandInterceptionContext<int> interceptionContext)
{
base.NonQueryExecuting(command, interceptionContext);//update,delete等写操作直接走主库
}
/// <summary>
/// 执行sql语句,并返回第一行第一列,没有找到返回null,如果数据库中值为null,则返回 DBNull.Value
/// </summary>
/// <param name="command"></param>
/// <param name="interceptionContext"></param>
public override void ScalarExecuting(DbCommand command,
DbCommandInterceptionContext<object> interceptionContext)
{
if (!string.IsNullOrWhiteSpace(GetReadConn()))//如果配置了读写分离,就去实现
{
if (!command.CommandText.StartsWith("insert", StringComparison.InvariantCultureIgnoreCase))
{
command.Connection.Close();
command.Connection.ConnectionString = GetReadConn();
command.Connection.Open();
}
}
base.ScalarExecuting(command, interceptionContext);
} /// <summary>
/// linq to entity生成的select,insert
/// 发送到sqlserver之前触发
/// warning:在select语句中DbCommand.Transaction为null,而ef会为每个insert添加一个DbCommand.Transaction进行包裹
/// </summary>
/// <param name="command"></param>
/// <param name="interceptionContext"></param>
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
if (!string.IsNullOrWhiteSpace(GetReadConn()))//如果配置了读写分离,就去实现
{
if (!command.CommandText.StartsWith("insert", StringComparison.InvariantCultureIgnoreCase))
{
command.Connection.Close();
command.Connection.ConnectionString = GetReadConn();
command.Connection.Open();
}
}
base.ReaderExecuted(command, interceptionContext);
}
/// <summary>
/// 发送到sqlserver之后触发
/// </summary>
/// <param name="command"></param>
/// <param name="interceptionContext"></param>
public override void ReaderExecuted(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
base.ReaderExecuted(command, interceptionContext);
}
}

运行程序可以设置一些测试代码

 public ActionResult Index()
{
IUnitOfWork db = new backgroundEntities();
IRepository<WebManageUsers> readUser = new BackgroundRepositoryBase<WebManageUsers>();
var a = readUser.GetModel().ToList();//读库
using (var trans = new TransactionScope())//事务写库
{
IRepository<WebManageUsers> userWrite = new BackgroundRepositoryBase<WebManageUsers>(db);
IRepository<WebManageMenus> menuWrite = new BackgroundRepositoryBase<WebManageMenus>(db);
var entity = new WebManageUsers
{
WebSystemID = ,
CreateDate = DateTime.Now,
DepartmentID = ,
Description = "",
Email = "",
LoginName = "test",
Mobile = "",
Operator = "",
Password = "",
RealName = "test",
Status = ,
UpdateDate = DateTime.Now,
};
var entity2 = new WebManageMenus
{
ParentID = ,
About = "",
LinkUrl = "",
MenuLevel = ,
MenuName = "test",
Operator = "",
SortNumber = ,
Status = ,
UpdateDate = DateTime.Now,
};
userWrite.Insert(entity);
menuWrite.Insert(entity2);
trans.Complete();
} return View(a);
}

最后的结果就是我们想要的,这里说明一点,仓储大步的读写分离没有数据库压力这块的考虑,只是随机去访问某个读库。

回到目录