MySql事務無法回滾的原因有哪些

2022-09-28 06:21:07 字數 1584 閱讀 8500

使用mysql時,如果發現事務無法回滾,但hibernate、spring、jdbc等配置又沒有明顯問題時,不要苦惱,先看看mysql建立的表有沒有問題,即表的型別。

innodb和myisam是在使用mysql最常用的兩個表型別,各有優缺點,視具體應用而定。基本的差別為:myisam型別不支援事務處理等高階處理,而innodb型別支援。myisam型別的表強程式設計客棧調的是效能,其執行數度比innodb型別更快,但是不提供事務支援,而innodb提供事務支援已經外部鍵等高階資料庫功能。

myiasm是iasm表的新版本,有如下擴充套件:

二進位制層次的可移植性。

null列索引。

對變長行比isam表有更少的碎片。

支援大檔案。

更好的索引壓縮。

更好的鍵嗎統計分布。

更好和更快的auto_increment處理。

以下是一些細節和具體實現的差別:

1. innodb不支援fulltext型別的索引。

2. innodb中不儲存表的具體行數,也就是說,執行select count(*)程式設計客棧 from table時,innodb要掃瞄一遍整個表來計算程式設計客棧有多少行,但是myisam只要簡單的讀出儲存好的行數即可。注意的是,當count(*)語句包含where條件時,兩種表的操作是一樣的。

3. 對於auto_increment型別的字段,innodb中必須包含只有該字段的索引,但是在myisam表中,可以和其他字段一起建立聯合索引。

4. delete from table時,innodb不會重新建立表,而是一行一行的刪除。

5. load table from master操作對innodb是不起作用的,解決方法是首先把innodb表改成myisam表,匯入資料後再改成innodb表,但是對於使用的額外的innodb特性(例如外來鍵)的表不適用。

另外,innodb表的行鎖也不是絕對的,如果在執行乙個sql語句時mysql不能確定要掃瞄的範圍,innodb表同樣會鎖全表,例如update table set num=1 where name like 「%aaa%」

任何一種表都不是萬能的,只用恰當的針對業務型別來選擇合適的表型別,才能最大的發揮mysql的效能優勢。

在mysql 5.0裡面,myisam和innodb儲存引擎效能差別並不是很大,針對innodb來說,影響效能的主要是 innodb_flush_log_at_trx_commit 這個選項,如果設定為1的話,那麼每次插入資料的時候都會自動提交,導致效能急劇程式設計客棧下降,應該是跟重新整理日誌有關係,設定為0效率能夠看到明顯提公升,當然,同樣你可以sql中提交「set autocommit = 0」來設定達到好的效能。另外,還聽說通過設定innodb_buffer_pool_size能夠提公升innodb的效能,但是我測試發現沒有特別明顯的提公升。

基本上我們可以考慮使用innodb來替代我們的myisam引擎了,因為innodb自身很多良好的特點,比如事務支援、儲存過程、檢視、行級鎖定等等,在併發很多的情況下,相信innodb的表現肯定要比myisam強很多,當然,相應的在my.cnf中的配置也是比較關鍵的,良好的配置,能夠有效的加速你的應用。

本文標題: mysql事務無法回滾的原因有哪些

本文位址: /shujuku/mysql/111497.html

mysql事務回滾

先收集網上的一些,待仔細測試研究 事務是資料庫更新操作的基本單位,事務回滾是指將該事務已經完成的對資料庫的更新操作撤銷。所謂事務是使用者定義的乙個資料庫操作序列,這些操作要麼全做要麼全不做,是乙個不可分割的工作 單位。例如,在關聯式資料庫中,乙個事務可以是一條sql語句 一組sql語句或整個程式。簡...

MySQL事務的回滾

在操作乙個事務時,如果,發現當前事務中的操作不合理,此時,只要還沒有提交事務,就可以通過回滾來取消當前事務 a賬號有1000元,b賬號有1000元 開啟乙個事務,使用update語句,將a賬號的100元,轉給b賬號 上述語句執行成功後,檢視a賬戶和b賬戶的金額 可以看出,a賬戶成功給b賬戶轉賬100...

MySQL事務和事務回滾

1 定義 一件事從開始發生到結束的整個過程 2 作用 確保資料一致性 3 事務和事務回滾應用 1 mysql中sql命令會自動commit到資料庫 show variables like autocommit 2 事務應用 1 開啟事務 mysql begin mysql 一條或多條sql語句 此時...