记一次使用MySQL数据库ORM为 SqlSugar 事务无效的处理过程

在项目中使用了开源代码框架admin.net ,其使用的数据库ORM为SqlSugar 

使用以下代码执行事务理论上应该有回滚发生,但数据任然删除了

 [UnitOfWork][ApiDescriptionSettings(Name = "Delete")] [HttpPost][DisplayName("删除菜单")]public async Task DeleteMenu(DeleteMenuInput input){var menuTreeList = await _sysMenuRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);var menuIdList = menuTreeList.Select(u => u.Id).ToList();await _sysMenuRep.DeleteAsync(u => menuIdList.Contains(u.Id));throw new Exception();// 级联删除角色菜单数据await _sysRoleMenuService.DeleteRoleMenuByMenuIdList(menuIdList);// 清除缓存DeleteMenuCache();}

初步排查可能是因为使用代码错误,于是查找SqlSugar官方代码

修改为直接使用事务也无法回滚

   /// <summary>/// 删除菜单/// </summary>/// <param name="input"></param>/// <returns></returns>[UnitOfWork][ApiDescriptionSettings(Name = "Delete")] [HttpPost][DisplayName("删除菜单")]public async Task DeleteMenu(DeleteMenuInput input){_sysMenuRep.Context.Ado.BeginTran();var menuTreeList = await _sysMenuRep.AsQueryable().ToChildListAsync(u => u.Pid, input.Id, true);var menuIdList = menuTreeList.Select(u => u.Id).ToList();await _sysMenuRep.DeleteAsync(u => menuIdList.Contains(u.Id));_sysMenuRep.Context.Ado.RollbackTran();//throw new Exception();// 级联删除角色菜单数据await _sysRoleMenuService.DeleteRoleMenuByMenuIdList(menuIdList);// 清除缓存DeleteMenuCache();}

心塞。不知道错误在哪。通过各种尝试,删除数据库切换服务器。重新生成数据库表。

两份代码,两份数据库一个能正常事务,一个不能正常事务。

于是进行对比。发现了细小差异。引擎为MyISAM。但是我创建库时已经选择了InnoDB啊不解 

解决方法:

将引擎调整为InnoDB后事务正常。

通过上面的问题排查总结以下注意事项目

1.SqlSugar ORM事务不可用时,检查数据库引擎,MySQL为单表引擎,每个表的引擎可能不一样。会导致错误。

2.写简单的demo 测试代码是否存在功能异常

3.排查不支持事务的数据库如 sqlLite

4.可以使用以下代码将表的引擎更新

ALTER TABLE db.tablename ENGINE=InnoDB;

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.hqwc.cn/news/7859.html

如若内容造成侵权/违法违规/事实不符,请联系编程知识网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

【sap2000】【python】python相关的3个案例-1/3

python相关的3个案例 Python COM&#xff0c;Python NET&#xff0c;IronPython的区别 这三个术语都与 Python 语言和其他编程平台&#xff08;尤其是 Microsoft .NET 及其组件&#xff09;之间的互操作性有关。我们来看看它们之间的主要区别&#xff1a; Python COM&#xf…

【进程】进程概念及相关函数实现

目录 0. 进程概述 1. 创建进程 1.1 进程的创建&#xff1a;fork函数 1.2 进程的等待&#xff1a;wait()、waitpid() 1.3 特殊进程&#xff1a;僵尸进程、孤儿进程、守护进程 1.4 进程的终止&#xff1a;exit和_exit函数 1.5 进程退出清理&#xff1a;atexit函数 1.6 进…

前端安全 - 保护你的应用免受攻击的关键

80. 前端安全 - 保护你的应用免受攻击的关键 作为前端工程师&#xff0c;我们不仅需要关注用户界面的设计和功能实现&#xff0c;还需要关注应用程序的安全性。前端安全是保护我们的应用程序免受恶意攻击和数据泄露的重要方面。本文将介绍前端安全的概念、常见的安全威胁以及一…

在k8s集群中部署一个应用程序

一、 k8s集群简单介绍 上图描述的是拥有一个Master(主)节点和六个Worker(工作)节点的k8s集群 Master 负责管理集群 负责协调集群中的所有活动&#xff0c;例如调度应用程序&#xff0c;维护应用程序的状态&#xff0c;扩展和更新应用程序。 Worker节点(即图中的Node)是VM(虚…

redis高可用(二)

redis高可用&#xff08;二&#xff09; 一、主从复制 1.概念 主从复制&#xff0c;是指将一台Redis服务器的数据&#xff0c;复制到其他的Redis服务器。前者称为主节点(Master)&#xff0c;后者称为从节点(Slave)&#xff1b;数据的复制是单向的&#xff0c;只能由主节点到…

【C++】一文理清C++中的五种强制类型转换

深入理解C中五种强制类型转换的使用场景 一、C风格的强制类型转换 使用形式&#xff1a; Type b (Type)a;C风格的强制类型转换很容易理解&#xff0c;不管什么类型都可以直接进行转换。C也支持C风格的强制类型转换&#xff0c;但是C风格的强制类型转换可能会带来一些隐患&a…

Vue3项目中引入ElementUI使用详解

目录 Vue3项目中引入 ElementUI1.安装2.引入2.1 全局引入2.2 按需引入viteWebpack 3.使用 Vue3项目中引入 ElementUI ElementUI是一个强大的PC端UI组件框架&#xff0c;它不依赖于vue&#xff0c;但是却是当前和vue配合做项目开发的一个比较好的ui框架&#xff0c;其包含了布局…

Go编写流量代理工具

目录 这是一个演示主要分为俩包&#xff1a;流程&#xff1a;逻辑&#xff1a;(端口随意&#xff0c;本地ssh为例)用法&#xff1a;文件地址&#xff1a;代码如下&#xff1a; 这是一个演示 代理本地HTTP服务 代理局域网SSH服务 其他的TCP服务没测试了 主要分为俩包&#x…

WebView头部添加android原生视频播放

需求&#xff1a;我们需要做一个h5页面&#xff0c;并且可以现实加载更多&#xff0c;并且头部我们想要加一个视频播放器&#xff0c;因为h5不够丝滑。 话不多说咱们直接上代码 Xml布局&#xff1a; <?xml version"1.0" encoding"utf-8"?> <…

SQL之收集SQL Server线程等待信息

要知道线程等待时间是制约SQL Server效率的重要原因&#xff0c;这一个随笔中将学习怎样收集SQL Server中的线程等待时间&#xff0c;类型等信息&#xff0c;这些信息是进行数据库优化的依据。 sys.dm_os_wait_stats 这是一个系统视图&#xff0c;里面存储线程所遇到的所有的等…

3D深度视觉与myCobot 320机械臂无序抓取

今天我记录使用myCobot320 M5跟FS820-E1深度相机进行一个无序抓取物体的分享。 为什么会选择深度相机和机械臂做一个案例呢&#xff1f; 2D相机&#xff08;最常见使用的相机&#xff09;可以捕捉二维图像&#xff0c;也就是在水平和垂直方向上的像素值。它们通常用于拍摄静态…

关于IE11的样式兼容问题记录

1、布局如下 <div class"map-label" :class"{active:isActive}" :style"{marginTop:${marTopVal}px}"><transition name"slide-fade"><div class"transition-out" v-if"show"><div class&q…