javamysql事務回滾(mysql是如何實現事務回滾的)

本文目錄一覽:

什麼是事務事務中的提交和回滾是什麼意思

事務(Transaction),一般是指要做的或所做的事情。在計算機術語中是指訪問並可能更新數據庫中各種數據項的一個程序執行單元(unit)。事務通常由高級數據庫操縱語言或編程語言(如SQL,C++或Java)書寫的用戶程序的執行所引起,並用形如begin transaction和end transaction語句(或函數調用)來界定。

事務的提交是指事務里的所有操作都正常完成。

事務的回滾是指程序或數據處理錯誤,將程序或數據恢復到上一次正確狀態的行為。

擴展資料:

事務的特徵:

事務應該具有4個屬性:原子性、一致性、隔離性、持久性。這四個屬性通常稱為ACID特性。

1、原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麼都做,要麼都不做。

2、一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。

隔離性(isolation)。一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相干擾。

4、持久性(durability)。持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

參考資料來源:百度百科-事務

參考資料來源:百度百科-回滾

mysql命令行下怎樣實現數據的回滾操作

當啟動Binlog後,事務會產生Binlog Event,這些Event被看做事務數據的一部分。因此要保證事務的Binlog Event和InnoDB引擎中的數據的一致性。所以帶Binlog的CrashSafe要求MySQL宕機重啟後能夠保證:

– 所有已經提交的事務的數據仍然存在。

– 所有沒有提交的事務的數據自動回滾。

– 所有已經提交了的事務的Binlog Event也仍然存在。

– 所有沒有提交事務沒有記錄Binlog Event。

這些要求很好理解,如果重啟後數據還在,但是Binlog Event沒有了,就沒辦法複製到其他節點上了。如果重啟後,數據沒了,但是Binlog Event還在,那麼不存在的數據就會被複制到其他節點上,從而導致主從的不一致。

為了保證帶Binlog的CrashSafe,MySQL內部使用的兩階段提交(Two Phase Commit)。

2 – MySQL的Two Phase Commit(2PC)

在開啟Binlog後,MySQL內部會自動將普通事務當做一個XA事務來處理:

– 自動為每個事務分配一個唯一的ID

– COMMIT會被自動的分成Prepare和Commit兩個階段。

– Binlog會被當做事務協調者(Transaction Coordinator),Binlog Event會被當做協調者日誌。

想了解2PC,可以參考文檔:【。】

– 分布式事務ID(XID)

使用2PC時,MySQL會自動的為每一個事務分配一個ID,叫XID。XID是唯一的,每個事務的XID都不相同。XID會分別被Binlog和InnoDB記入日誌中,供恢復時使用。MySQ內部的XID由三部分組成:

– 前綴部分

前綴部分是字符串”MySQLXid”

– Server ID部分

當前MySQL的server_id

– query_id部分

為了保證XID的的唯一性,數字部分使用了query_id。MySQL內部會自動的為每一個語句分配一個query_id,全局唯一。

參考代碼:sql/xa。h的struct xid_t結構。

– 事務的協調者Binlog

Binlog在2PC中充當了事務的協調者(Transaction Coordinator)。由Binlog來通知InnoDB引擎來執行prepare,commit或者rollback的步驟。事務提交的整個過程如下:

1. 協調者準備階段(Prepare Phase)

告訴引擎做Prepare,InnoDB更改事務狀態,並將Redo Log刷入磁盤。

2. 協調者提交階段(Commit Phase)

2.1 記錄協調者日誌,即Binlog日誌。

2.2 告訴引擎做commit。

注意:記錄Binlog是在InnoDB引擎Prepare(即Redo Log寫入磁盤)之後,這點至關重要。

在MySQ的代碼中將協調者叫做tc_log。在MySQL啟動時,tc_log將被初始化為mysql_bin_log對象。參考sql/binlog.cc中的init_server_components():

if (opt_bin_log) tc_log= mysql_bin_log;

而在事務提交時,會依次執行:

tc_log-prepare();

tc_log-commit();

參考代碼:sql/binlog.cc中的ha_commit_trans()。當mysql_bin_log是tc_log時,prepare和commit的代碼在sql/binlog.cc中:

MYSQL_BIN_LOG::prepare();

MYSQL_BIN_LOG::commit();

-協調者日誌Xid_log_event

作為協調者,Binlog需要將事務的XID記入日誌,供恢復時使用。Xid_log_event有以下幾個特點:

– 僅記錄query_id

因為前綴部分不變,server_id已經記錄在Event Header中,Xid_log_event中只記錄query_id部分。

– 標誌事務的結束

在Binlog中相當於一個事務的COMMIT語句。

一個事務在Binlog中看起來時這樣的:

Query_log_event(“BEGIN”);DML產生的events; Xid_log_event;

– DDL沒有BEGIN,也沒有Xid_log_event 。

– 僅InnoDB的DML會產生Xid_log_event

因為MyISAM不支持2PC所以不能用Xid_log_event ,但會有COMMIT Event。

Query_log_event(“BEGIN”);DML產生的events;Query_log_event(“COMMIT”);

問題:Query_log_event(“COMMIT”)和Xid_log_event 有不同的影響嗎?

– Xid_log_event 中的Xid可以幫助master實現CrashSafe。

– Slave的CrashSafe不依賴Xid_log_event

事務在Slave上重做時,會重新產生XID。所以Slave服務器的CrashSafe並不依賴於Xid_log_event 。Xid_log_event 和Query_log_event(“COMMIT”),只是作為事務的結尾,告訴Slave Applier去提交這個事務。因此二者在Slave上的影響是一樣的。

3 – 恢復(Recovery)

這個機制是如何保證MySQL的CrashSafe的呢,我們來分析一下。這裡我們假設用戶設置了以下參數來保證可靠性:

– 恢復前事務的狀態

在恢復開始前事務有以下幾種狀態:

– InnoDB中已經提交

根據前面2PC的過程,可知Binlog中也一定記錄了該事務的的Events。所以這種事務是一致的不需要處理。

– InnoDB中是prepared狀態,Binlog中有該事務的Events。

需要通知InnoDB提交這些事務。

– InnoDB中是prepared狀態,Binlog中沒有該事務的Events。

因為Binlog還沒記錄,需要通知InnoDB回滾這些事務。

– Before InnoDB Prepare

事務可能還沒執行完,因此InnoDB中的狀態還沒有prepare。根據2PC的過程,Binlog中也沒有該事務的events。 需要通知InnoDB回滾這些事務。

– 恢復過程

從上面的事務狀態可以看出:恢復時事務要提交還是回滾,是由Binlog來決定的。

– 事務的Xid_log_event 存在,就要提交。

– 事務的Xid_log_event 不存在,就要回滾。

恢復的過程非常簡單:

– 從Binlog中讀出所有的Xid_log_event

– 告訴InnoDB提交這些XID的事務

– InnoDB回滾其它的事務

MySQL的事務回滾是什麼意思啊

多條sql執行時,任何一條失敗就所有sql不執行,保證數據的完整性和一致性。

有沒有什麼辦法可以把mysql回滾到某一時間

我們經常會遇到操作一張大表,發現操作時間過長或影響在線業務了,想要回退大表操作的場景。在我們停止大表操作之後,等待回滾是一個很漫長的過程,儘管你可能對知道一些縮短時間的方法,處於對生產環境數據完整性的敬畏,也會選擇不做介入。最終選擇不作為的原因大多源於對操作影響的不確定性。實踐出真知,下面針對兩種主要提升事務回滾速度的方式進行驗證,一種是提升操作可用內存空間,一種是通過停實例,禁用 redo 回滾方式進行進行驗證。

仔細閱讀過官方手冊的同學,一定留意到了對於提升大事務回滾效率,官方提供了兩種方法:一是增加 innodb_buffer_pool_size 參數大小,二是合理利用 innodb_force_recovery=3 參數,跳過事務回滾過程。第一種方式比較溫和,innodb_buffer_pool_size 參數是可以動態調整的,可行性也較高。第二種方式相較之下較暴力,但效果較好。

兩種方式各有自己的優點,第一種方式對線上業務系統影響較小,不會中斷在線業務。第二種方式效果更顯著,會短暫影響業務連續,回滾所有沒有提交的事務。

mysql 什麼時候採取事務回滾

1

首先看一下student 表裡的數據

2

輸入start transaction 開啟事務

3

更新第一行數據,然後查看結果,發現更新成功了。

4

注意看了,這裡就開始回滾了。輸入rollback. 然後再查看第一行的數據,可以發現之前跟新的數據變回去了。

5

最後我們查看整個表,可以看到還是和之前一樣。

用JAVA連接MYsql數據庫時出現異常如何處理?

事務回滾,因為它已被標記為回滾。 如果執行mysql成功則commit,否則則rollback

原創文章,作者:SPTCJ,如若轉載,請註明出處:https://www.506064.com/zh-hant/n/317837.html

(0)
打賞 微信掃一掃 微信掃一掃 支付寶掃一掃 支付寶掃一掃
SPTCJ的頭像SPTCJ
上一篇 2025-01-11 16:28
下一篇 2025-01-11 16:28

相關推薦

  • 如何修改mysql的端口號

    本文將介紹如何修改mysql的端口號,方便開發者根據實際需求配置對應端口號。 一、為什麼需要修改mysql端口號 默認情況下,mysql使用的端口號是3306。在某些情況下,我們需…

    編程 2025-04-29
  • 如何實現圖像粘貼到蒙版

    本文將從多個方面介紹圖像粘貼到蒙版的實現方法。 一、創建蒙版 首先,在HTML中創建一個蒙版元素,用於接收要粘貼的圖片。 <div id=”mask” style=”widt…

    編程 2025-04-29
  • Python操作MySQL

    本文將從以下幾個方面對Python操作MySQL進行詳細闡述: 一、連接MySQL數據庫 在使用Python操作MySQL之前,我們需要先連接MySQL數據庫。在Python中,我…

    編程 2025-04-29
  • MySQL遞歸函數的用法

    本文將從多個方面對MySQL遞歸函數的用法做詳細的闡述,包括函數的定義、使用方法、示例及注意事項。 一、遞歸函數的定義 遞歸函數是指在函數內部調用自身的函數。MySQL提供了CRE…

    編程 2025-04-29
  • Django ORM如何實現或的條件查詢

    在我們使用Django進行數據庫操作的時候,查詢條件往往不止一個,一個好的查詢語句需要考慮我們的查詢要求以及業務場景。在實際工作中,我們經常需要使用或的條件進行查詢,本文將詳細介紹…

    編程 2025-04-29
  • Java Hmily分布式事務解決方案

    分布式系統是現在互聯網公司架構中的必備項,但隨着業務的不斷擴展,分布式事務的問題也日益凸顯。為了解決分布式事務問題,Java Hmily分布式事務解決方案應運而生。本文將對Java…

    編程 2025-04-28
  • Python一次性輸入10個數如何實現?

    Python提供了多種方法進行輸入,可以手動逐個輸入,也可以一次性輸入多個數。在需要輸入大量數據時,一次性輸入十個數就非常方便。下面我們從多個方面來講解如何一次性輸入10個數。 一…

    編程 2025-04-28
  • MySQL bigint與long的區別

    本文將從數據類型定義、存儲空間、數據範圍、計算效率、應用場景五個方面詳細闡述MySQL bigint與long的區別。 一、數據類型定義 bigint在MySQL中是一種有符號的整…

    編程 2025-04-28
  • MySQL左連接索引不生效問題解決

    在MySQL數據庫中,經常會使用左連接查詢操作,但是左連接查詢中索引不生效的情況也比較常見。本文將從多個方面探討MySQL左連接索引不生效問題,並給出相應的解決方法。 一、索引的作…

    編程 2025-04-28
  • 如何實現van-picker點擊遮罩不關閉

    van-picker是一個非常實用的Vue組件,但默認情況下,點擊遮罩會自動關閉選擇器。本文將介紹如何通過代碼實現van-picker點擊遮罩不關閉的功能。 一、通過覆蓋遮罩實現 …

    編程 2025-04-27

發表回復

登錄後才能評論