MySQL系列:事務機制

一、MySQL併發訪問控制

  1.併發控制機制

   (1)鎖機制

       資源競爭時候,多個線程表示多個用戶會話;通過讀寫鎖機制實現

  讀鎖:共享鎖,可以多個用戶同時讀取同一資源文件

  寫鎖:獨佔鎖,當一個用戶對資源文件進行寫操作時,其他線程既不能讀也不能寫

   (2)鎖粒度

             表級鎖:對於整個表進行的鎖操作,併發處理有限,在線事務處理讀寫一樣多時會出問題

             行級鎖:對於部分資源的鎖操作

   (3)鎖策略

           在鎖粒度及數據安全性尋求的平衡機制;每種存儲引擎都可以自行實現其鎖策略和鎖粒度;

            MySQL在服務器級也實現了鎖,表級鎖;Innodb自行實現了行級鎖,而無需人爲干預

   (4)分類

隱式鎖:由存儲引擎自動施加鎖;

顯式鎖:手動添加

 

  2.命令行施加鎖

    (1) LOCK TABLES    tbl_name[[AS] alias] lock_type [, tbl_name [[AS] alias] lock_type] …  READ[LOCAL] | [LOW_PRIORITY] WRITE

            指明鎖定表和鎖類型,可一次指明多個表,還可以加別名;服務器層面表級別鎖

               lock_type所類型:READWRITE

               UNLOCKTABLES;

    (2)FLUSH TABLEStb_name[,...] [WITH READ LOCK] [FOR UPDATE]  

  FLUSH 清理,把表寫到磁盤關閉再打開

 UPDATE更新

    (3) SELECT clase[FOR UPDATE] [WITH READ LOACK]

 

 

 

二、MySQL事務操作

  1.ACID測試

      A:atomicity,原子性;整個事務中的所有操作要麼全部成功執行,要麼全部失敗後回滾;

      C:consistency,一致性;數據庫總是從一個一致性狀態轉換爲另一個一致性狀態;

       I:Isolation,隔離性;一個事務所做出的操作在提交之前,是不能爲其它所見;隔離有多種隔離級別;

隔離級別越高,意味着數據安全性越高,但併發性越低

      D:durability:持久性;一旦事務提交,其所做的修改會永久保存於數據庫中;

 

  2.事務概念

      事務一組原子性的SQL查詢語句一個獨立工作單元。當操作需要多步驟完成時候,爲了保證安全或者數據完整性而引入的機制,其執行的一組語句要麼全部都執行,要麼在無法中斷時候能夠回顧,使得數據還原。

例如:銀行系統中的轉賬操作需要保證事務一致

 

  3.事務流程

          第一步:顯示啓動事務語句:START TRANSACTION;

         ...執行的SQL語句

          ...

          第二步:結束事務方式

                          (1) COMMIT:提交,寫入到數據庫文件中確保永久有效

                          (2) ROLLBACK: 回滾

    注意

         1) 只有事務型存儲引擎方能支持此類操作;例如Inoodb支持事務、MyISAM不支持事務

         2) 建議顯式請求和提交事務,而不要使用“自動提交autocommit”功能,每一次提交都會進行IO操作,降低系統性能

                    MariaDB[(none)]> SHOW GLOBAL VARIABLES LIKE 'autocommit';

                               autocommit={1|0}0表示關閉off

wKioL1ckSBahADPhAABLtnDo6Tg580.png

  臨時修改實例:

                 MariaDB [(none)]> SET SESSIONautocommit=0;      # 設置會話界別的自動提交

                 MariaDB[(none)]> SHOW VARIABLES  LIKE'autocommit';

wKioL1ckSBeB7N28AABv5e5Fo10992.png

3) 事務支持savepoint(保存點),在進行中加入保存點可以指定點回滾,若無savepoint則必須回滾到起始處

  SAVEPOINT identifier  指明標識符

  ROLLBACK [WORK] TO[SAVEPOINT] identifier  回滾到標識點

  RELEASE SAVEPOINTidentifier      刪除標識點

                 實例:

                       MariaDB[(none)]> SAVEPOINT sp1

                       MariaDB[(none)]> SAVEPOINT sp2

                       MariaDB[(none)]> SAVEPOINT sp3

                       MariaDB[(none)]> ROLLBACK  TO sp2

 

  4.事務隔離級別:mysql支持到第三級別

    (1)隔離級別

READ UNCOMMITTED (讀未提交):問題一、二、三

READ COMMITTED (讀提交):問題二、三

REPEATABLE READ (可重讀):問題三

SERIALIZABILE (可串行化):問題四

    注意:

隔離級別越低可能存在的問題可能性越大;可能存在問題:

問題一:髒讀

讀取到別人尚未提交的數據

問題二:不可重複讀

兩次讀取別人提交的數據不一致

問題三:幻讀

對方提交修改數據,自己在一次事務中認爲沒有發生變化

問題三:加鎖讀

加上鎖之後,其他用戶無法讀取

    (2)修改隔離級別

             MariaDB [(none)]> SHOWPROCESSLISTS;   # 查看連接線程

wKiom1ckR0iCJLyxAABPwnCS6wk076.png

註釋:

        tx_isolation:服務器變量,默認爲REPEATABLE-READ;可在SESSION級進行修改;

                    MariaDB[(none)]>SETtx_isolation=''

READ-UNCOMMITTEDREAD-COMMITTEDREPEATABLE-READSERIALIZABLE

    注意:    

         可能會出現死鎖問題:兩個或多個事務在同一資源相互佔用,並請求鎖定對方佔用的資源的狀態;

         各存儲引擎自己有死鎖檢測和死鎖超時機制,檢測死鎖的循環依賴發送錯誤通知

         不能解決死鎖問題會導致查詢非常慢

 

  4.事務日誌文件

   (1)預寫式日誌

           事務日誌幫助實現崩潰後揮發,是保證數據持久、回滾、提高事務效率的一個重要工具。

           事務日誌的寫入類型爲"追加",不是修改數據,使用的是一段連續的空間,其操作爲"順序IO",避免了寫數據文件造成的大量隨機IO,保證快速的將提交的操作持久存儲在磁盤上,再刷寫到硬盤上日誌通常也被稱爲"預寫式日誌(writeahead logging)"

           Orcal中分爲:redologundolog重做日誌和撤銷日誌

   (2)mysql事務日誌參數

innodb_log_file_size

日誌文件大小

innodb_log_files_in_group

同一組中有多少文件

innodb_log_group_home_dir

一組日誌文件存放的位置,/表示mysql數據的工作目錄

innodb_log_buffer_size

存儲日誌時的緩衝

innodb_log_block_size

日誌塊的大小

      注意:

          1) 不支持運行修改,需要修改配置文件後重啓;

          2) 建議不要使用太大的事務日誌空間,防止崩潰恢復

          3) 不要混合使用不同的存儲引擎,因爲事務日誌是不一致的

          4) 崩潰後的恢復時間取決於事務日誌的大小和其中所存儲的事務日誌的數量

發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章