首頁 > 軟體

MySQL事務管理的作用詳解

2022-08-25 22:01:37

1.為何使用事務管理

可以保證資料的完整性。事務(Transaction),就是將一組SQL語句放在同一批次內去執行,如果一個SQL語句出錯,則該批次內 的所有SQL都將被取消執行。

例子: 轉賬為例。

金庸向張無忌轉賬1000元。----在資料庫中修改兩個賬號的餘額。

發生意外情況,則出現金庸減錢成功,而張無忌加錢失敗。 如何解決?

使用事務進行解決,此時程式碼執行後金庸的錢沒有減,張無忌的錢也沒有加

2.資料庫事務的原理

如果不寫begin;commit;此時事務預設自動開啟,自動提交; 在資料庫中 ,事務都是自動提交的。事務的自動提交就是 執行sql語句完成之後 就立刻持久化到資料庫中。

begin;開始事務

rollback;回滾事務

commit;提交事務

當我們新增了begin;和commit;後 事務的提交就從自動變成手動。因為中途出錯,所以導致 commit;不執行,也就是說緩衝區中的資料沒有到持久化 的資料庫中 。

public class Test {
    public static void main(String[] args) {
        Connection connection =null;
            try {
                    Class.forName("com.mysql.cj.jdbc.Driver");
                    connection= DriverManager.getConnection(
                    "jdbc:mysql://localhost:3306/mydb?serverTimezone=Asia/Shanghai",
                     "root","123456");
                    connection.setAutoCommit(false);//開啟事務的手動提交
                 String sql = "update tb_emp set salary=salary-1000 where name='金庸'";
                    PreparedStatement ps =connection.prepareStatement(sql);
                    ps.executeUpdate();
                String sql1 = "update tb_emp setsalary=salary+1000 where name='張無忌'";
                    ps = connection.prepareStatement(sql1);
                    ps.executeUpdate();
                    connection.commit();//提交事務
                }catch (Exception e){
                    try {
                         connection.rollback();//事務回滾 最初的狀態
                        } catch (SQLException throwables) {
                            throwables.printStackTrace();
                         }
                        e.printStackTrace();
                        }finally{
                                }
               }
            }

3.什麼是事務

從開啟到提交為一個事務。 由此可見,一個事務對應一組業務。一個事務中間可以有一條sql,多條sql。 所以 一個業務開始之前 開啟事務 一個業務 結束之後 提交事務。 我們這個轉賬案例:需要幾個事務? 可以寫成兩個事務,但是不合適。因為我們的需求 讓金庸減的同時讓張無忌加錢。只能寫 成一個事 務。 把多條sql語句當作一件事情,要同時都能執行到。

事務(Transaction),一般是指要做的或所做的事情。在計算機術語 中是指存取並可能更新資料庫中各種資料項的一個程式執行單元 (unit)。事務通常由高階資料庫操縱語言或程式語言(如SQL,C++或 Java)書寫的使用者程式的執行所引起,並用形如begin transaction和 end transaction語句(或函數呼叫)來界定。事務由事務開始 (begin transaction)和事務結束(end transaction)之間執行的全體 操作組成。

概括為: 事務是由一些列動作組成,這些動作要麼都執行,要麼都不執行。

3.1 事務的特性ACID

1、原子性(Atomicity): 事務開始後所有操作,要麼全部做完,要麼全部不做,不可能停滯在中間 環節。事務執行過程中 出錯,會回滾到事務開始前的狀態,所有的操作就 像沒有發生一樣。也就是說事務是一個不可分 割的整體,就像化學中學過 的原子,是物質構成的基本單位。

2、一致性(Consistency): 事務開始前和結束後,資料庫的資料完整性約束沒有被破壞,事務前後操 作資料是一致的 。比如 A向B轉賬,不可能A扣了錢,B卻沒收到。 能量守恆。

3、隔離性(Isolation): 一個事務的執行不能被其他事務干擾。即一個事務內部的操作及使用的數 據對並行的其他事務是 隔離的,並行執行的各個事務之間不能互相干擾。 比如A正在從一張銀行卡中取錢,在A取錢的過 程結束前,B不能向這張卡 轉賬。 兩個事務之間是有隔離級別,隔離級別的不同會導致出現不同的問 題。此時產生三種讀: 髒讀 幻讀 不可重複讀。

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

3.2 事務的並行問題

1、髒讀:

事務A讀取了事務B更新的資料,然後B回滾操作,那麼A讀取到的資料是髒資料。

2、不可重複讀

事務A多次讀取同一資料,事務B在事務A多次讀取的過程中,對資料作了更新並提交,導致事務A多次讀取同一資料時,結果不一致。

3、幻讀

已知有兩個事務A和B,A從一個表中讀取了資料,然後B在該表中插入了一些新資料,導致A再次讀取同一個表,就會多出幾行,簡單的說,一個事務中先後讀取一個範圍的記錄,但每次讀取的記錄數不同,稱之為幻象讀。

小結:不可重複讀和幻讀容易混淆,不可重複讀側重於修改,幻讀側重於新增或刪除,解決不可重複讀的問題只需鎖住滿足條件的行,解決幻讀需要鎖表。

3.3 隔離級別

事務隔離性的等級:

檢視事務的隔離等級:

語句:select @@global.transaction_isolation,@@transaction_isolation;

事務的隔離等級有四點,每種隔離等級有其會出現的情況

1.Read Uncommitted(讀取未提交內容)

在該隔離級別,所有事務都可以看到其他未提交事務的執行結果。本隔離級別很少用於實際應用,因為它的效能也不比其他級別好多少。讀取未提交的資料,也被稱之為髒讀(Dirty Read)。

2.Read Committed(讀取提交內容 也叫做不可重複讀)

這是大多數資料庫系統的預設隔離級別(但不是MySQL預設的)。它滿足了隔離的簡單定義:一個事務只能看見已經提交事務所做的改變。這種隔離級別 也支援所謂的不可重複讀(Nonrepeatable Read),因為同一事務的其他範例在該範例處理其間可能會有新的commit,所以同一select可能返回不同結果。

一個事務讀某條資料讀兩遍,讀到的是不一樣的資料,也就是說,一個事務在進行中讀取到了其他事務對舊資料的修改結果,(比如說 我開一個事務 修改某條資料 先查後改 執行修改動作的時候發現這條資料已經被別的事務刪掉了)

3.Repeatable Read(可重讀)

這是MySQL的預設事務隔離級別,它確保同一事務的多個範例在並行讀取資料時,會看到同樣的資料行。不過理論上,這會導致另一個棘手的問題:幻讀 (Phantom Read)。簡單的說,幻讀指當用戶讀取某一範圍的資料行時,另一個事務又在該範圍內插入了新行,當用戶再讀取該範圍的資料行時,會發現有新的“幻影” 行。InnoDB和Falcon儲存引擎通過多版本並行控制(MVCC,Multiversion Concurrency Control)機制解決了該問題。

一個事務中,讀取到了其他事務新增的資料,彷彿出現了幻象。(幻讀與不可重複讀類似,不可重複讀是讀到了其他事務update/delete的結果,幻讀是讀到了其他事務insert的結果)

4.Serializable(可序列化)

這是最高的隔離級別,它通過強制事務排序,使之不可能相互衝突,從而解決幻讀問題。簡言之,它是在每個讀的資料行上加上共用鎖。在這個級別,可能導致大量的超時現象和鎖競爭。

隔離級別越高,然後執行效率越低。

4.Spring事務管理

到此這篇關於MySQL事務管理的作用詳解的文章就介紹到這了,更多相關MySQL事務管理內容請搜尋it145.com以前的文章或繼續瀏覽下面的相關文章希望大家以後多多支援it145.com!


IT145.com E-mail:sddin#qq.com