spring + hibernate + mysql 事务不回滚
生活随笔
收集整理的這篇文章主要介紹了
spring + hibernate + mysql 事务不回滚
小編覺(jué)得挺不錯(cuò)的,現(xiàn)在分享給大家,幫大家做個(gè)參考.
首先聲明,這個(gè)問(wèn)題涉及到的數(shù)據(jù)庫(kù)是MySQL。這是個(gè)很奇怪的問(wèn)題,事務(wù)怎么會(huì)不回滾呢?實(shí)際上這是個(gè)愚蠢的問(wèn)題,是經(jīng)驗(yàn)不足導(dǎo)致的,越是奇怪的問(wèn)題解決起來(lái)就越容易。不回滾的根本原因不在Hibernate,更不是SSH框架,而在MySQL本身。
查看MySQL數(shù)據(jù)庫(kù)使用的存儲(chǔ)引擎:mysql>show variables like '%storage_engine%';結(jié)果:+----------------+--------+?|Variable_name |Value|?+----------------+--------+?|storage_engine|InnoDB|?+----------------+--------+?1 row in set
查看MySQL提供什么存儲(chǔ)引擎:mysql>show engines;結(jié)果:+------------+---------+----------------------------------------------------------------+--------------+------+------------+ | 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
從結(jié)果上看,當(dāng)前數(shù)據(jù)庫(kù)的默認(rèn)存儲(chǔ)引擎是InnoDB(注意觀察Support這一列的值),不過(guò)有的數(shù)據(jù)庫(kù)卻不是,它們默認(rèn)的是MyISAM。非但如此,在Support一欄中還顯示NO,就是說(shuō)連InnoDB都不支持。這就是為什么不回滾的原因:InnoDB支持事務(wù),而MyISAM不支持!其實(shí)MyISAM是MySQL默認(rèn)的存儲(chǔ)引擎,在安裝MySQL時(shí)如果沒(méi)有指定存儲(chǔ)引擎,那么MySQL會(huì)默認(rèn)使用MyISAM,因?yàn)樗恢С质聞?wù),也許效率會(huì)比InnoDB高一些。
如果使用的是MyISAM,那么需要將其改為InnoDB,具體方法如下:1、打開(kāi)“MySQL_HOME/my.ini”,找到[mysqld],在它的下面有一句話是“skip-innodb”,將其注釋掉,即改為:#skip-innodb。2、在[mysqld]下加上一句“default_table_type=INNODB”(如果寫(xiě)成default-storage-engine=INNODB也可以,兩者之間的區(qū)別我還沒(méi)有研究過(guò))3、重啟MySQL服務(wù)(注意:是重啟服務(wù),不是光退出數(shù)據(jù)庫(kù)就完事了!)4、再次執(zhí)行mysql> show engines;可以看見(jiàn)默認(rèn)存儲(chǔ)引擎已經(jīng)變成InnoDB了。5、原來(lái)已經(jīng)存在的表,如果想使用事務(wù),要修改它的存儲(chǔ)引擎,在默認(rèn)是InnoDB的情況下刪除重建。當(dāng)不想刪除的時(shí)候,執(zhí)行alter table 表名 ENGINE = InnoDB;之后執(zhí)行show table status from 數(shù)據(jù)庫(kù)名 where name='表名';可以查看表狀態(tài),看存儲(chǔ)引擎是否被修改了。
在使用了InnoDB引擎之后,再次運(yùn)行代碼,回滾成功!
查看MySQL數(shù)據(jù)庫(kù)使用的存儲(chǔ)引擎:mysql>show variables like '%storage_engine%';結(jié)果:+----------------+--------+?|Variable_name |Value|?+----------------+--------+?|storage_engine|InnoDB|?+----------------+--------+?1 row in set
查看MySQL提供什么存儲(chǔ)引擎:mysql>show engines;結(jié)果:+------------+---------+----------------------------------------------------------------+--------------+------+------------+ | 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
從結(jié)果上看,當(dāng)前數(shù)據(jù)庫(kù)的默認(rèn)存儲(chǔ)引擎是InnoDB(注意觀察Support這一列的值),不過(guò)有的數(shù)據(jù)庫(kù)卻不是,它們默認(rèn)的是MyISAM。非但如此,在Support一欄中還顯示NO,就是說(shuō)連InnoDB都不支持。這就是為什么不回滾的原因:InnoDB支持事務(wù),而MyISAM不支持!其實(shí)MyISAM是MySQL默認(rèn)的存儲(chǔ)引擎,在安裝MySQL時(shí)如果沒(méi)有指定存儲(chǔ)引擎,那么MySQL會(huì)默認(rèn)使用MyISAM,因?yàn)樗恢С质聞?wù),也許效率會(huì)比InnoDB高一些。
如果使用的是MyISAM,那么需要將其改為InnoDB,具體方法如下:1、打開(kāi)“MySQL_HOME/my.ini”,找到[mysqld],在它的下面有一句話是“skip-innodb”,將其注釋掉,即改為:#skip-innodb。2、在[mysqld]下加上一句“default_table_type=INNODB”(如果寫(xiě)成default-storage-engine=INNODB也可以,兩者之間的區(qū)別我還沒(méi)有研究過(guò))3、重啟MySQL服務(wù)(注意:是重啟服務(wù),不是光退出數(shù)據(jù)庫(kù)就完事了!)4、再次執(zhí)行mysql> show engines;可以看見(jiàn)默認(rèn)存儲(chǔ)引擎已經(jīng)變成InnoDB了。5、原來(lái)已經(jīng)存在的表,如果想使用事務(wù),要修改它的存儲(chǔ)引擎,在默認(rèn)是InnoDB的情況下刪除重建。當(dāng)不想刪除的時(shí)候,執(zhí)行alter table 表名 ENGINE = InnoDB;之后執(zhí)行show table status from 數(shù)據(jù)庫(kù)名 where name='表名';可以查看表狀態(tài),看存儲(chǔ)引擎是否被修改了。
在使用了InnoDB引擎之后,再次運(yùn)行代碼,回滾成功!
總結(jié)
以上是生活随笔為你收集整理的spring + hibernate + mysql 事务不回滚的全部?jī)?nèi)容,希望文章能夠幫你解決所遇到的問(wèn)題。
- 上一篇: DHCP数据恢复
- 下一篇: MySQL进阶篇(03):合理的使用索引