mysql默認引擎MyISAM引起的spring事務/session緩存失效

感謝:http://blog.csdn.net/zhangdaiscott/article/details/8203807#comments


總結:

   1.數據庫如無法支持事務(如:mysql採用MyISAM引擎),則spring管理session事務及session的緩存機制全部失效.


首先聲明,這個問題涉及到的數據庫是MySQL。這是個很奇怪的問題,事務怎麼會不回滾呢?

實際上這是個愚蠢的問題,是經驗不足導致的,越是奇怪的問題解決起來就越容易。

不回滾的根本原因不在Hibernate,更不是SSH框架,而在MySQL本身。

查看MySQL提供什麼存儲引擎:mysql>show engines;

(或者:查看MySQL數據庫使用的存儲引擎:mysql>show variables like '%storage_engine%';)

結果:


從結果上看,我本機當前數據庫的默認存儲引擎是MyISAM(注意觀察Support這一列的值),這就是爲什麼不回滾的原因: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引擎之後,再次運行代碼,回滾成功!


(由於接手了老的項目,mysql引擎全部採用默認的MyISAM,問了架構師是爲了:爲了快和節省空間???,事務全在代碼層面控制???)

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章