MySQL數據庫的事務
1、MySQL數據庫的事務
在MySQL數據庫中,事務默認是會自動提交的,也就是說,如果沒有用 begin ... commit 來顯式提交事務的話,MySQL 會認為每一條SQL語句都是一個事務,也就是每一條SQL語句都會自動提交。另外,Oracle數據庫默認是不會自動提交事務的,也就是必須得顯式地commit,SQL才會生效。
我們可以通過下面的語句來查詢是否自動提交事務:
SELECT @@autocommit; -- 結果為1表示自動提交,0表示不是自動提交
查詢結果:

可以看到默認是為自動提交的。
也可以通過下面語句來設置不自動提交事務
SET @@autocommit = 0;
當設置為不自動提交事務后,每一條 SQL 語句都需要顯式地使用 commit 來提交才行,不然的話不會持久性地作用到數據庫中。
UPDATE websites SET websites.alexa = 444 WHERE websites.id = 1;
COMMIT; -- 當設置為不自動提交時,必須得顯式地commit,SQL才會提交,起持久性作用。否則執行上面的update語句數據庫也不會被更新
2、處理事務
在 MYSQL 中事務處理主要有兩種方法:
1)用 BEGIN, ROLLBACK, COMMIT來實現
- BEGIN 開始一個事務
- ROLLBACK 事務回滾
- COMMIT 事務確認
BEGIN; -- MySQL中也可以用START TRANSACTION UPDATE accounts SET balance = balance - 100 WHERE id = 1; UPDATE accounts SET balance = balance + 100 WHERE id = 2; COMMIT;
2)直接用 SET 來改變 MySQL 的自動提交模式。因為在MySQL中,默認自動提交事務,也就是任意一條SQL語句都會被當做是一個事務,并且自動提交,所以如果不使用 begin .. commit 的話,在MySQL中需要將自動提交關閉掉。
- SET AUTOCOMMIT=0 禁止自動提交
- SET AUTOCOMMIT=1 開啟自動提交
Connection conn = openConnection(); try { // 關閉自動提交: conn.setAutoCommit(false); // 執行多條SQL語句: insert(); update(); delete(); // 提交事務: conn.commit(); } catch (SQLException e) { // 回滾事務: conn.rollback(); } finally { conn.setAutoCommit(true); //最后恢復至自動提交 conn.close(); }

浙公網安備 33010602011771號