执行多条SQL语句时任意语句失败如何回滚已执行操作的影响?
解决方案
通过EF自带的显式事务包裹SQL执行逻辑即可实现原子性操作,完全沿用原有SQL写法,无需使用存储过程:
bool isDeleted = false; // 开启数据库事务 using (var transaction = db.Database.BeginTransaction()) { try { var sqlCommand = @"DELETE FROM table1 WHERE id = @Id DELETE FROM table2 WHERE id = @Id"; // 此处SQL执行逻辑和原有写法完全一致 int affectRows = db.Database.ExecuteSqlCommand(sqlCommand, new SqlParameter("@Id", Id)); // 无异常则提交所有操作 transaction.Commit(); isDeleted = affectRows > 0; } catch { // 任意执行异常回滚所有已执行操作 transaction.Rollback(); isDeleted = false; } }
- 原有SQL语句里开头多余的
@已移除,逐字字符串标识@需放在引号前才能正常识别换行 - 只要任意一条SQL执行报错,事务会自动回滚所有操作,最终返回
false,不会出现部分数据被删除的问题
内容的提问来源于stack exchange,提问作者Fanny Hunayn
相关产品推荐
相关产品推荐

