sql - 删除在 SQL 中创建死锁
问题描述
我有两张桌子说 T1 和 T2。T1 在 T2 中有一个引用,如下所示:
表:T1
|Col1|
|v1 |
|v2 |
|v3 |
表:T2
|Id|Col1|Col2|
|1 |v1 |v2 |
|2 |v2 |v1 |
|3 |v1 |v3 |
|4 |v3 |v1 |
所以我们有一个 T1 的主键作为 T2 Col1 和 Col2 的外键。现在,每当对 T1 发出删除请求时(比如我想删除 v1),首先需要从 T2 中删除其引用的行(在这种情况下 T2 中的 Id 1,2,3,4 ),然后 T1 中的记录将删除。
现在,当我们尝试使用实体框架删除它时,它陷入了死锁并失败了。
关于如何解决这个问题的任何建议?
更新的 EF 代码:
using (_dbContext as IDisposable)
{
var t1= _dbContext.T1
.Include(t1 => t1.Table3)
.FirstOrDefault(x => x.Id == Col1);
var lstT2 = _dbContext.T2
.Where(x => x.Col1 == value ||
x.Col2== value).ToList();
using (var transaction = _dbContext.BeginTransaction())
{
try
{
foreach (var t2 in lstT2)
{
_dbContext.T2.Remove(t2);
_dbContext.SaveChanges();
}
_dbContext.T1.Remove(t1);
_dbContext.SaveChanges();
transaction.Commit();
}
catch (Exception ex)
{
transaction.Rollback();
NLogger.Log(LogLevel.Error, ex.Message);
throw ex;
}
}
解决方案
推荐阅读
- asp.net - 添加 + 作为 URL 的一部分时,Api 给出 404 (%2B)
- ruby-on-rails - 通过 user_id 查找并终止所有活动会话
- javascript - Yup.mixed().test() 似乎破坏了 Formik 表单验证
- html - 有没有办法制作没有滞后的固定背景图像?
- java - BlockHound 在使用 LettuceConnectionFactory 时检测到对 ReactiveRedisTemplate 的阻塞调用
- javascript - 如何使用串联数组创建表
- docker - 从主机 masine 访问 docker-compose 卷(将文件“复制到”容器中并从外部访问容器文件)
- java - 由于 karate-core 类无法解决,因此无法在 VSCode 中运行“karate-demo”跑步者
- regex - BigQuery - 将字符串转换为数字
- go - 如何在 gorilla mux 中的 Get Subrouter 中为特定路由使用特定中间件