`
bmladmin
  • 浏览: 30639 次
  • 性别: Icon_minigender_1
  • 来自: 四川成都
社区版块
存档分类
最新评论

spring + hibernate + mysql 事务不回滚

 
阅读更多

首先声明,这个问题涉及到的数据库是MySQL。
这是个很奇怪的问题,事务怎么会不回滚呢?实际上这是个愚蠢的问题,是经验不足导致的,越是奇怪的问题解决起来就越容易。
不回滚的根本原因不在Hibernate,更不是SSH框架,而在MySQL本身。


查看MySQL数据库使用的存储引擎:
mysql>show variables like '%storage_engine%';
结果:
+----------------+--------+ 
|Variable_name |Value| 
+----------------+--------+ 
|storage_engine|InnoDB
+----------------+--------+ 
1 row in set


查看MySQL提供什么存储引擎:
mysql>show engines;
结果:
+------------+---------+----------------------------------------------------------------+--------------+------+------------+ | Engine | Support | Comment | Transactions | XA | Savepoints | +------------+---------+----------------------------------------------------------------+--------------+------+------------+ | MyISAM | YES | Default engine as of MySQL 3.23 with great performance | NO | NO | NO | | CSV | YES | CSV storage engine | NO | NO | NO | | MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO | | BLACKHOLE | YES | /dev/null storage engine (anything you write to it disappears) | NO | NO | NO | | FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL | | InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES | | ARCHIVE | YES | Archive storage engine | NO | NO | NO | | MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO | +------------+---------+----------------------------------------------------------------+--------------+------+------------+ 8 rows in set

从结果上看,当前数据库的默认存储引擎是InnoDB(注意观察Support这一列的值),不过有的数据库却不是,它们默认的是MyISAM。非但如此,在Support一栏中还显示NO,就是说连InnoDB都不支持。
这就是为什么不回滚的原因:InnoDB支持事务,而MyISAM不支持!
其实MyISAM是MySQL默认的存储引擎,在安装MySQL时如果没有指定存储引擎,那么MySQL会默认使用MyISAM,因为它不支持事务,也许效率会比InnoDB高一些。

如果使用的是MyISAM,那么需要将其改为InnoDB,具体方法如下:
1、打开“MySQL_HOME/my.ini”,找到[mysqld],在它的下面有一句话是“skip-innodb”,将其注释掉,即改为:#skip-innodb。
2、[mysqld]下加上一句“default_table_type=INNODB”(如果写成default-storage-engine=INNODB也可以,两者之间的区别我还没有研究过
3、重启MySQL服务(注意:是重启服务,不是光退出数据库就完事了!)
4、再次执行mysql> show engines;可以看见默认存储引擎已经变成InnoDB了。
5、原来已经存在的表,如果想使用事务,要修改它的存储引擎,在默认是InnoDB的情况下删除重建。
当不想删除的时候,执行
alter table 表名 ENGINE = InnoDB;
之后执行
show table status from 数据库名 where name='表名';
可以查看表状态,看存储引擎是否被修改了。

在使用了InnoDB引擎之后,再次运行代码,回滚成功!
分享到:
评论

相关推荐

    Spring+Hibernate+MySql的应用实例

    在Spring+Hibernate的集成中,Spring可以作为Hibernate的事务管理器,处理事务的开始、提交、回滚等操作。通过SessionFactory和Session接口,Hibernate可以进行对象持久化,将Java对象转换为数据库中的记录。 **...

    spring + hibernate + atomikos + mysql (diff database)

    涉及的是一个集成开发环境,其中Spring是Java企业级应用的核心框架,Hibernate是一个流行的ORM(对象关系映射)解决方案,Atomikos是一个开源的JTA(Java Transaction API)实现,用于处理分布式事务,而MySQL是一个...

    JTA-demo:spring+hibernate+jta+mysql

    标题“JTA-demo:spring+hibernate+jta+mysql”揭示了一个集成示例,它展示了如何在Java应用中使用Spring框架、Hibernate ORM工具以及Java Transaction API(JTA)来管理事务,同时与MySQL数据库进行交互。...

    SpringMVC+Spring+Hibernate(SSH)框架搭建之二

    5. **事务管理**:事务未正确开启或提交可能导致数据不一致,确保事务边界正确。 在SSH框架下,Spring负责管理bean、AOP(面向切面编程)和事务控制,Struts则处理请求转发和视图展现。整合这三个框架,可以构建出...

    spring mvc + spring + hibernate 全注解整合开发视频教程 10

    在Spring和Hibernate的整合中,Spring可以管理Hibernate的SessionFactory和Transaction,实现声明式事务管理。通过@Transactional注解,我们可以轻松地在方法级别控制事务的开始、提交和回滚。这样,无需显式调用...

    (Spring2.5+hibernate3.2)框架源码

    Spring 提供了声明式事务管理,允许开发者在配置中声明事务边界,无需在业务代码中显式处理事务开始、提交和回滚。这使得代码更加简洁,也易于维护。 Hibernate,作为 ORM 框架,将 Java 对象与数据库表之间建立了...

    spring mvc+hibernate实现事务管理(配置文件版)

    本项目是关于如何使用Spring MVC与Hibernate结合来实现事务管理的实践教程,通过MyEclipse自动生成所需的包和配置文件。这里将详细讲解这一过程,以及涉及到的关键知识点。 首先,Spring MVC作为Spring框架的一部分...

    spring+hibernate.zip

    在现代Java企业级应用开发中,Spring和Hibernate是两个不可或缺的框架。Spring以其强大的依赖注入(Dependency Injection)和面向切面编程(Aspect-Oriented Programming)能力,成为了事实上的应用程序框架标准。而...

    Spring boot+Atomikos+JTA+Hibernate+MySQL实现分布式事务+多数据源(可运行)

    本项目使用Spring Boot、Atomikos、JTA(Java Transaction API)、Hibernate和MySQL来实现分布式事务处理和多数据源管理,以确保在多个数据库操作之间保持事务的ACID特性。 首先,Spring Boot作为微服务开发的主流...

    Struts2+Spring+Hibernate 整合

    同时,Spring的事务管理配置也是必不可少的,它可以确保在发生异常时能够正确回滚事务。 在整合过程中,还需要注意一些关键点,例如Struts2的插件配置,如Spring插件用于整合Spring容器,Hibernate插件则可以帮助...

    Struts2+Spring+hibernate

    当Action执行业务逻辑时,Spring可以根据配置自动开启和提交/回滚事务。 3. **数据访问**:Hibernate作为持久层框架,处理数据库操作。Spring可以与Hibernate整合,通过SessionFactory和Session接口,提供透明的ORM...

    spring3+hibernate4声明式事务配置(xml方式)

    Spring3和Hibernate4的集成可以帮助开发者实现高效、灵活的持久化层管理,并通过声明式事务管理来保证数据的一致性。本教程将深入探讨如何使用XML配置来设置Spring3和Hibernate4的声明式事务管理。 首先,我们需要...

    spring+hibernate+jta demo

    《Spring、Hibernate与JTA在MyEclipse中的整合实践》 在现代企业级应用开发中,Spring、Hibernate和Java Transaction API(JTA)是常见的技术组合。Spring作为轻量级的IoC(Inversion of Control)和AOP(Aspect ...

    spring hibernate mysql 事务实例

    在IT行业中,数据库事务是确保数据一致性的重要机制,特别是在分布式系统和多层架构中,如Spring、Hibernate和MySQL的组合。本实例将深入探讨如何在这样的环境中实现事务管理。 Spring框架以其强大的依赖注入和AOP...

    SSH2整合(Struts2+Spring+Hibernate)+SQL Server2008案例

    通过Spring的声明式事务管理,可以在全局范围内控制事务的开始、提交和回滚,确保数据的一致性。 SQL Server2008是Microsoft提供的关系型数据库管理系统,提供了高性能、高可用性和安全性。在SSH2整合项目中,SQL ...

    Spring.net+hibernate实例

    例如,我们可以使用@Transactional注解标记方法,让Spring.NET自动管理事务的开始、提交或回滚。 在"DecorateLib"这个文件夹名中,可能包含的是关于装饰者模式的相关代码示例。装饰者模式是一种设计模式,它允许在...

    解忧杂货铺Spring+Struts2+Hibernate

    Spring的事务管理功能使得在数据库操作中能够确保数据的一致性,即使在发生异常时也能进行回滚,保证了系统的健壮性。 其次,Struts2作为MVC(Model-View-Controller)框架,是前端控制器,负责接收用户请求,处理...

    spring配置sessionFactory(spring3.2.3+hibernate4.2.2)

    `@Transactional`注解表明该类中的所有方法都应在事务内执行,如果发生异常,事务将被回滚。 总结起来,整合Spring 3.2.3与Hibernate 4.2.2,主要涉及以下几个步骤: 1. 添加相关依赖。 2. 配置Hibernate实体类和...

    spring3,hibernate4 配置声明式事务管理(annotation方式)

    总的来说,Spring 3和Hibernate 4结合使用声明式事务管理,使得我们无需在代码中显式调用事务开始、提交和回滚,而是通过注解和配置文件来声明事务的边界和行为。这种方式降低了代码的复杂度,提高了可维护性和可...

Global site tag (gtag.js) - Google Analytics