代码配置都没问题,为什么事务不回滚了解Mysql数据库引擎

在进行调试的过程中发现配置在service层的事务不起作用,抛出异常后数据库的更新还是成功了,事务并没有回滚,然后就开始各种检查,查看spring的事务是否配置正确,进入更新方法时是否开启了事务,经过检查之后发现一切都正常,那为什么事务不回滚呢?问题出在了一个很难会去考虑的地方(数据库里创建的表不...
代码配置都没问题,为什么事务不回滚了解Mysql数据库引擎
前几天开发中遇到了一个问题,在进行调试的过程中发现配置在service层的事务不起作用,抛出异常后数据库的更新还是成功了,事务并没有回滚,然后就开始各种检查,查看spring的事务是否配置正确,进入更新方法时是否开启了事务,经过检查之后发现一切都正常, 前几天开发中遇到了一个问题,在进行调试的过程中发现配置在service层的事务不起作用,抛出异常后数据库的更新还是成功了,事务并没有回滚,然后就开始各种检查,查看spring的事务是否配置正确,进入更新方法时是否开启了事务,经过检查之后发现一切都正常,那为什么事务不回滚呢?问题出在了一个很难会去考虑的地方(数据库里创建的表不支持事务)。Mysql数据库默认的创建表的引擎是:MYISAM,使用这种引擎的表效率高,但是不支持事务,所以我们在建表时最好是根据需求手动去指定我们需要的引擎,下面是一个能够支持事务的建表sql,可以参考一下:CREATE TABLE test (id varchar(32) PRIMARY KEY, name varchar(32), create_time datetime, create_user varchar(32) ,address varchar(20) NOT NULL ,remark varchar(100)) ENGINE = InnoDB DEFAULT CHARSET=utf8备注:ENGINE = InnoDB这个配置就是选择何种引擎,InnoDB这种引擎支持事务。下面是Mysql数据库常见的几种引擎的说明,可以了解一下,下次再创建表我们就可以选择合适引擎了。ISAM:索引顺序访问法(Index Sequential Access Mode)ISAM是一个定义明确且历经时间考验的数据表格管理方法,它在设计之时就考虑到数据库被查询的次数要远大于更新的次数。因此,ISAM执行读取操作的速度很快,而且不占用大量的内存和存储资源。ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错,如果你的硬盘崩溃了,那么数据文件就无法恢复了。如果你正在把ISAM用在关键任务应用程序里,那就必须经常备份你所有的实时数据,通过其复制特性,MYSQL能够支持这样的备份应用程序。MyISAM:Mysql的默认存储引擎MyISAM是MySQL的ISAM扩展格式和缺省的数据库引擎。除了提供ISAM里所没有的索引和字段管理的大量功能,MyISAM还使用一种表格锁定的机制,来优化多个并发的读写操作,其代价是你需要经常运行OPTIMIZE TABLE命令,来恢复被更新机制所浪费的空间。MyISAM还有一些有用的扩展,例如用来修复数据库文件的MyISAMCHK工具和用来恢复浪费空间的 MyISAMPACK工具。MYISAM强调了快速读取操作,这可能就是为什么MySQL受到了WEB开发如此青睐的主要原因:在WEB开发中你所进行的大量数据操作都是读取操作。所以,大多数虚拟主机提供商和INTERNET平台提供商只允许使用MYISAM格式。MyISAM格式的一个重要缺陷就是不能在表损坏后恢复数据。HEAP:HEAP允许只驻留在内存里的临时表格。驻留在内存里让HEAP要比ISAM和MYISAM都快,但是它所管理的数据是不稳定的,而且如果在关机之前没有进行保存,那么所有的数据都会丢失。在数据行被删除的时候,HEAP也不会浪费大量的空间。HEAP表格在你需要使用SELECT表达式来选择和操控数据的时候非常有用。要记住,在用完表格之后就删除表格。InnoDB:InnoDB数据库引擎都是造就MySQL灵活性的技术的直接产品,这项技术就是MYSQL++ API。在使用MYSQL的时候,你所面对的每一个挑战几乎都源于ISAM和MyISAM数据库引擎不支持事务处理(transaction process)也不支持外来键。尽管要比ISAM和 MyISAM引擎慢很多,但是InnoDB包括了对事务处理和外来键的支持,这两点都是前两个引擎所没有的。如果你的设计需要这些特性中的一者或者两者,那你就要被迫使用INNODB和BERKLEY引擎中的一个了,我们常用的是InnoDB。InnoDB给MySQL提供了具有提交、回滚和崩溃恢复能力的事务安全(ACID兼容)存储引擎。InnoDB锁定在行级并且也在SELECT语句提供一个Oracle风格一致的非锁定读,这些特色增加了多用户部署和性能。没有在InnoDB中扩大锁定的需要,因为在InnoDB中行级锁定适合非常小的空间。InnoDB也支持FOREIGN KEY强制。在SQL查询中,你可以自由地将InnoDB类型的表与其它MySQL的表的类型混合起来,甚至在同一个查询中也可以混合。这是mysql官方的描述。如果还想了解更多那就多去网上查查吧... 2023-07-27
mengvlog 阅读 9 次 更新于 2025-07-20 08:27:24 我来答关注问题0
  • ISAM的两个主要不足之处在于,它不支持事务处理,也不能够容错,

  •  翡希信息咨询 SpringBoot 系列教程之事务不生效的几种 case

    在标记为事务的方法内部,如果使用子线程执行数据库操作,事务不生效。子线程的异常不会被主线程的事务管理器捕获,导致事务无法回滚。传播属性:事务的传播属性决定了事务的行为方式,如REQUIRED、REQUIRES_NEW等。误用事务传播属性可能导致事务不生效或不符合预期。了解这些事务不生效的场景对于高效管理数据库...

  •  翡希信息咨询 关于 Spring事务失效,我总结了这7个原因

    数据库不支持事务:原因:确保所使用的数据库支持事务,例如MySQL的InnoDB引擎。如果数据库本身不支持事务,那么Spring事务将无法正常工作。类未被Spring管理:原因:类必须被Spring管理,否则AOP代理机制无法创建事务所需的资源。如果类没有被Spring容器管理,那么事务将不会生效。方法非public:原因:Spring获取...

  •  文暄生活科普 为什么private方法加了@transactional,事务也没有生效?

    事务不生效的原因1. 访问权限问题一个方法的访问权限决定了Spring是否可以访问并代理这个方法以实现事务管理。通常,为了确保事务功能正常,方法的访问权限应该定义为public。如果使用了private、protected或default权限,Spring将无法生成代理对象,因此事务功能无法生效。2. 方法使用final修饰当一个方法被final修饰...

  •  翡希信息咨询 Spring事务失效的 8 大原因,这次可以吊打面试官了!

    原因:在类内部的方法之间调用时,如果没有通过Spring代理进行事务控制,事务将不会生效。解决方案:通过注入类本身的方式使用注入的对象调用其他方法,但这不是最佳实践。更有效的方法是使用特定的事务传播行为来开启新的事务。数据源配置不当:原因:如果当前数据源未配置事务管理器,事务控制将无法启动。

檬味博客在线解答立即免费咨询

mySQL相关话题

Copyright © 2023 WWW.MENGVLOG.COM - 檬味博客
返回顶部