项目框架就是标准的ssh,测试发现不能实现数据回滚,花了大半天的时间去检查配置和程序均没有问题,主要是从以下几方面去查找问题:spring 事务配置、嵌套事务、异常是否已经被捕获、dao是否强制commit。
实在找不到原因,就在相同框架的前一个项目中测试,确能正常控制数据回滚,太奇怪了,此时突然想到当前项目的数据库是mysql,mysql的表是有事务安全( 比如:InnoDB)和非事务安全(比如:ISAM、MyISAM)之分的,随即登录到mysql数据库查看:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 |
show create table NAP_TB_USER; CREATE TABLE `NAP_TB_USER` ( `ID` bigint(20) NOT NULL auto_increment, `EMAIL` varchar(50) default NULL, `MOBILE` varchar(20) default NULL, `MSN` varchar(50) default NULL, `INDEX_SETTING` varchar(50) default NULL, `PASSWORD` varchar(50) default NULL, `PHONE` varchar(20) default NULL, `REAL_NAME` varchar(50) default NULL, `USER_NAME` varchar(50) NOT NULL, PRIMARY KEY (`ID`), UNIQUE KEY `USER_NAME` (`USER_NAME`) ) ENGINE=MyISAM DEFAULT CHARSET=utf8 |
可知当前的表类型是MyISAM,是非事务安全的,所以无法实现数据回滚。
只要修改表的类型即可:
1 |
alter table tablename type=InnoDb; |
如果是用hibernate自动建表,而mysql数据库默认的建表类型不是InnoDb,需要修改配置文件:
1 |
<property name="dialect">org.hibernate.dialect.MySQLInnoDBDialect</property> |
原创文章,转载请注明: 转载自micmiu – 软件开发+生活点滴[ http://www.micmiu.com/ ]
本文链接地址: http://www.micmiu.com/j2ee/spring/spring-transaction-mysql/
不光是spring,只要不设置InnoDb就不会支持事物….
嗯,这个当然了。我标题意思只是为了表示当时的错误现象