日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

spring + hibernate + mysql 事务不回滚

發布時間:2025/3/16 数据库 30 豆豆
生活随笔 收集整理的這篇文章主要介紹了 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 事务不回滚的全部內容,希望文章能夠幫你解決所遇到的問題。

如果覺得生活随笔網站內容還不錯,歡迎將生活随笔推薦給好友。