首頁 >資料庫 >mysql教程 >關於Mysql事務性

關於Mysql事務性

一个新手
一个新手原創
2017-10-13 10:30:141375瀏覽

1》事務指的是什麼?
          事務可以看做一個業務邏輯處理單元,這個單元要麼執行,要麼不執行;
2》ACID的原則:
       (Consistency)
            A 帳戶有3000塊, B 帳戶2000快,
             --〠 --和B帳戶總和是5000快
           事物執行之前和執行之後,這個總和這個狀態,應該一致的。
       (3)隔離性(Lsolation)
              A帳戶從3000               A賬戶從3000    ##                select sun() A B 之間總和
      (4)持久性(Durability)
              保證持久性:
           事務之前將資料寫入到磁碟上去了,如果要撤回呢?資料從磁碟上撤回?速度很慢?很痛苦?怎麼辦?
             2>結合事務志來完成
                   與資料區存在時它與存在什麼區別文件?
                 區別:事務誌產生的是順序I/O,而磁碟資料檔案是隨機I/O 事務日誌每一個操作都是次序寫到磁碟上一個連續的儲存區塊裡面去的,而我們的資料檔案並非如此。
                       (1)東西日誌:順序IO
            隨機輸出 系統             將事務寫入到事務日誌當中,過一會之後事物後台或相關的進程將事務當中的資料重新落地到資料檔當中,這樣我們保證事物所操作的資料的持久性。

3》事務的狀態.
      (1)要麼是活動事務
              事務正在執行當中#  我們知道事務要麼執行,要麼不執行,哪什麼叫做部分提交呢?
              就是事務已經執行,一部分已經寫入磁碟,另一部分正在執行當中,最後一條執行語句正在寫的過程當中,我們把它叫做提交了,但是並沒有達到目的,叫做失敗的事務
      (4)中止的事務

              中止的是叫做沒有提交,或者走一半就提前結束了,叫做中止。  

      (5)提交的事務
              健康提交完成的事務,我們的事務一定是存在這5種狀態中的某一中,一旦提交,就無法在事務中提交,就無法撤銷事務。

4》事務的同時與調度
       事務的同時:
            1>提高吞吐量與資源使用率##〠     1>          事務之間提交為了降低彼此之間的影響,我們的需要事務進行隔離,如果隔離呢?這要靠事務調度來完成,任何一個資料庫系統本身在事務調度上都有這複雜           調度方法集合很多的策略來完成調度的,一般來講為了保證事務的隔離性和原子性,他們需要通過事務調度來完成,而調度通常的策略有2種:
         

          事務調度:
              1>可恢復調度
     〠  時候,任何兩個事務的交叉執行都不會導致另一個事務的狀態改變,我們將它稱為:可恢復調度

              2>無級聯調度
                 結束後恢復中恢復的任何行為和行為之後的可恢復狀態之後的任何可恢復狀況?影響,尤其是在事務回滾的時候還是會影響,在事務進行回滾的時候還是會                    影響,所以為了避免回滾的時候產生影響還可以實行所謂的叫做:無級聯調度。

5》事務的隔離
         我們知道事務調度,事務可能涉及多個操作,這些操作可以交叉執行,事務調度的存在就是為了更好調度次序使得這些交叉執行彼此之間不會產生過大的影        響,那麼為了進可能降低事務之間的影響,於是我們有所謂的隔離級別,  事務的隔離級別有四個。哪四個?
             1>讀取未提交read uncommitted
           1>讀取未提交read uncommitted
                     〠            與等級好多少,讀取未提交的數            據,也被成為:髒讀(Dirty Read)    
             2>    大多數的資料庫的預設隔離等級(但是Mysql預設等級不是這個),它滿足了隔離的簡單定義:一個事務只能看到見已經提交事務所所做的改變;      
             3>可重讀 repeatable read級別,它確保同一個事務的多個實例在並發讀取資料時,會看到同樣的資料行,不過理論上,這導致另一個問題:幻讀(Phantom                  read) 簡單的說法:幻讀指當作使用者讀取某一範圍的資料行時,另一個事務在該範圍內插入了新一行,當使用者再讀取該範圍的資料行時,會發現新的「幻影行」
         ,Innodb和Falcon引擎透過多重版本並發控制(MVCC)機制解決了這個問題。

         4>可串列serializable

                  這就最高層級的隔離機制,它透過強迫事務排序,使其步能相互衝突、簡單的幻說:從而解決了它在步能相互衝突的問題排序,使其步能相互衝突、從而解決了幻話每個讀取資料行加上了一個共享鎖定,在這個級別,            可能導致大量的逾時現象和鎖定競爭.

                一般來講我們的並發控制一般來實現隔離我們的等級,一般意義來實現隔離我們的等級,一般意義來實現隔離我們的等級,一般意義來實現隔離我們的等級,一般意義來實現隔離我們的等級,一般意義來實現隔離我們的等級,一般意義來實現隔離我們的程度。並發控制來實現,而我們的並發控制即時
                  技術依賴於幾種技術:
          1 鎖定鎖定「鎖定」與鎖定時鎖定「鎖定」.                    (2).時間戳,必須記錄每筆事務的啟動時間和執行時間
                    (3).多重版本與快照隔離

 㠀    ).        事務的餓死狀態(鎖飢餓):
                   當一個事務申請一種類型的鎖,為了實現並發控制,它肯需要這道鎖,但是由於事務調度的結果,導致它一直得不到該鎖,所產生的結果就是:# 。除此之外還有一種鎖叫做:死鎖

6》啟動事務與回滾

     一般來說啟動事務的操作:
            1&  
            2>事務回滾
                 〠        〠  〠  #             3>提交事務
                  commit
      gt;啟動一個事務
                  start transaction;
          〠2&F 刪除其中一個# 中的資訊;   delete from student where num='4'
           3>如果進行資料復原?事務回滾。猜對了。
                  rollback;
           4>檢查驗證,4是否恢復回來了?
                  select * from student;
           
           1>啟動一個事務
               〠 start〠
o                  delete from student where num='4'
         commit ;

           4>再嘗試回滾

               
                 select * from student;
                      例如:一個事務裡面有一個百個操作,100個操作語句,我執行到第80條的時候,才發現第75個出錯了執行錯了,這時候是不是要回滾,前80個都撤                  回,而這時候於怎時辦呢? 保存點的作用就出來。例如:我每10個作業保存一次:    
          ---->10(做保存點1)------>20(存檔點2)

  做一個啟動一個啟動   1 事務
                start transaction;
          2> delete from student where name='cuihua'
                  保存一個事務點
     ##           3>刪除其中一個student表中的"西門吹牛"的信息
              chun delete from students         savepoint yyb    
          4>刪除其中一個student表的"牛二"的訊息

                delete from student where name='niuer'

           point  〠〠〠〠   5>好了開始恢復
                如果想恢復西門吹雪
     什麼是yya這個保存點呢?      
          6>檢查是否恢復成功
                select * from student;#

          6.3 事務的自動提交
          1>查詢mysql事務自動提交
                   mysql> select @@autocommit;
                  〠       ----+
                             | @@autocommit |
      | @@autocommit |
                                  +-------- ------+
                             1 row in set (0.00 sec)
2#             set autocommit=0;

          3>測試驗證
                 delete from student where name='ximenchuniu'
             〠〠   是否恢復回來?而且我們沒有明確啟動一個事務把?事務支援DML語句回滾.DDL為隱試提交,所以很遺憾不支援。

   驗證讀取未提交:
           查詢隔離等級select @@tx_isolation;
         一個mysql,開兩個窗口,雙方交叉啟動一個交易
   視窗二共同的操作:

             1.select @@tx_isolation;

         > 是 tg_Lad solation);
         > 視窗1作業:
            1.start transaction; 啟動一個交叉的事務
              2.update student set age='70'  where d_id='1010';#>一個交叉的事務
              2.select * 從 student;兩個窗口,雙方交叉啟動一個事務
   窗口1和窗口2共同的操作:
             1.select @@tx_isolation;##〠 td
#             窗口1操作:
             1.start  transaction;啟動一個交叉的事務
             2.update student set      2.update student set      2.update student 1         3.commit; 只有這裡提交了,在2視窗第三步驟才會重新看到所提交的資料

           視窗2動作
             student;   未看到1窗口更新資料
             3.select * from student;   當A視窗執行了3步驟提交後,才能看到更新數據,避免髒讀        

   驗證可重讀
            一個mysql,開兩個窗口,雙方交叉啟動一個事務
   幻影讀:
           12段一個交易同一天查詢語句得到記錄數量都不同稱為幻影讀

            視窗1與視窗2共同的操作:
             㠀  㠀1.select @x   2.set tx_isolation='repeatable-read ';

            視窗1操作
              1.start transaction age='60' where num='10';
              3.commit ;

            視窗2操作
              1.start  transaction; 啟動一個〠與含 含〠)未看到1視窗所更新資料
              3.select * from student ;   1commit;後依舊未看到1視窗所更新資料
              4.commit;    2視窗提交後才可看到1視窗索取兩個窗口,雙方交叉啟動一個事務
             視窗1與視窗2共同的操作:
              2.set tx_isolation='serializable';

             窗口。操作之後,才能執行!


             視窗2操作
                提交了,1視窗的update 方能執行成功。這個就是可串行!
             原因:
                兩個事務同時交叉執行的相同資料,而一方必須先提交。否則讀寫會互相阻塞。

以上是關於Mysql事務性的詳細內容。更多資訊請關注PHP中文網其他相關文章!

陳述:
本文內容由網友自願投稿,版權歸原作者所有。本站不承擔相應的法律責任。如發現涉嫌抄襲或侵權的內容,請聯絡admin@php.cn