Chinaunix首页 | 论坛 | 博客
  • 博客访问: 2289996
  • 博文数量: 266
  • 博客积分: 5485
  • 博客等级: 大校
  • 技术积分: 3695
  • 用 户 组: 普通用户
  • 注册时间: 2007-06-20 11:05
个人简介

多读书,多做事,广交朋友,趣味丛生

文章分类

全部博文(266)

分类: Java

2011-06-27 09:37:00

   项目框架就是标准的ssh,测试发现不能实现数据回滚,花了大半天的时间去检查配置和程序均没有问题,主要是从以下几方面去查找问题:spring 事务配置、嵌套事务、异常是否已经被捕获、dao是否强制commit。 
   实在找不到原因,就在相同框架的前一个项目中测试,确能正常控制数据回滚,太奇怪了,此时突然想到当前项目的数据库是mysql,mysql的表是有事务安全( 比如:InnoDB)和非事务安全(比如:ISAM、MyISAM)之分的,随即登录到mysql数据库查看:
    show create table t_dn_ledger_approver
    CREATE TABLE `t_dn_ledger_approver` (
        `id` int(11) NOT NULL AUTO_INCREMENT,
        `ledgerDocId` bigint(20) DEFAULT NULL,
        `orderAliasCode` varchar(256) COLLATE gbk_bin DEFAULT NULL,
        `userId` bigint(20) DEFAULT NULL,
        `singleApproveTime` datetime DEFAULT NULL,
         PRIMARY KEY (`id`),
         UNIQUE KEY `ledgerDocId` (`ledgerDocId`,`orderAliasCode`)
     ) ENGINE=MyISAM AUTO_INCREMENT=50 DEFAULT CHARSET=gbk COLLATE=gbk_bin
    可知当前的表类型是MyISAM,是非事务安全的,所以无法实现数据回滚。
只要修改表的类型即可:
     alter table tablename type=InnoDb;  
如果是用hibernate自动建表,而mysql数据库默认的建表类型不是InnoDb,需要修改配置文件
Xml代码 :
     <property name="dialect">org.hibernate.dialect.MySQLInnoDBDialectproperty> 

阅读(4743) | 评论(0) | 转发(0) |
给主人留下些什么吧!~~