MySQL之:事務(wù)

并發(fā)控制

鎖粒度:

  • 表級鎖
  • 行級鎖

鎖:

  • 讀鎖:共享鎖,只讀不可寫,多個讀互相不阻塞
  • 寫鎖:獨占鎖,排它鎖,一個寫鎖會阻塞其它讀和寫鎖

實現(xiàn):

  • 存儲引擎:自行實現(xiàn)其鎖策略和鎖粒度
  • 服務(wù)器級:實現(xiàn)了鎖,表級鎖;用戶可顯式請求

分類:

  • 隱式鎖:由存儲引擎自動施加鎖
  • 顯式鎖:用戶手動請求

鎖策略:

在鎖粒度及數(shù)據(jù)安全性尋求的平衡機制

顯示使用鎖:

  • 加鎖
    LOCK TABLES
    tbl_name [[AS] alias] lock_type
    [,tbl_name [[AS] alias] lock_type] ...
    
    lock_type:READ,WRITE
  • 解鎖
    UNLOCK TABLES
  • 關(guān)閉正在打開的表(清除查詢緩存),通常在備份前加全局讀鎖
    FLUSH TABLES tb_name[,...] [WITH READ LOCK]
  • 查詢時加寫或讀鎖
    SELECT clause [FOR UPDATE | LOCK IN SHARE MODE]

死鎖:

兩個或多個事務(wù)在同一資源相互占用,并請求鎖定對方占用的資源的狀態(tài)


事務(wù)

事務(wù)Transactions:

一組原子性的SQL語句,或一個獨立工作單元

事務(wù)日志:

記錄事務(wù)信息,實現(xiàn)undo,redo等故障恢復功能

  • 事務(wù)日志的寫入類型為“追加”,因此其操作為“順序I/O”;通常也被稱為:預寫式日志 write ahead logging
  • 日志文件:ib_logfile0,ib_logfile1

ACID特性:

  • A:atomicity原子性;整個事務(wù)中的所有操作要么全部成功執(zhí)行,要么全部失敗后回滾
  • C:consistency一致性;數(shù)據(jù)庫總是從一個一致性狀態(tài)轉(zhuǎn)換為另一個一致性狀態(tài)
  • I:Isolation隔離性;一個事務(wù)所做出的操作在提交之前,是不能為其它事務(wù)所見;隔離有多種隔離級別,實現(xiàn)并發(fā)
  • D:durability持久性;一旦事務(wù)提交,其所做的修改會永久保存于數(shù)據(jù)庫中

啟動事務(wù):

START TRANSACTION

結(jié)束事務(wù):

  1. COMMIT:提交
  2. ROLLBACK:回滾

注意:只有事務(wù)型存儲引擎方能支持此類操作
建議:顯式請求和提交事務(wù),而不要使用“自動提交”功能
set autocommit={1|0}

事務(wù)支持保存點:savepoint

SAVEPOINT identifier
ROLLBACK [WORK] TO [SAVEPOINT] identifier
RELEASE SAVEPOINT identifier

事務(wù)隔離級別:從上至下更加嚴格

  • READ UNCOMMITTED:可讀取到未提交數(shù)據(jù),產(chǎn)生臟讀
  • READ COMMITTED:可讀提交數(shù)據(jù),但未提交數(shù)據(jù)不可讀,產(chǎn)生不可重復讀,即可讀取到多個提交數(shù)據(jù),導致每次讀取數(shù)據(jù)不一致
  • REPEATABLE READ:可重復讀,多次讀取數(shù)據(jù)都一致,產(chǎn)生幻讀,即讀取過程中,即使有其它提交的事務(wù)修改數(shù)據(jù),仍只能讀取到未修改前的舊數(shù)據(jù),此為MySQL默認設(shè)置
  • SERIALIZABILE:可串行化,未提交的讀事務(wù)阻塞修改事務(wù),或者未提交的修改事務(wù)阻塞讀事務(wù)。導致并發(fā)性能差
事務(wù)隔離級別 臟讀可能性 不可重復讀可能性 幻讀可能性 加鎖讀
讀未提交(read-uncommitted)
不可重復讀(read-committed)
可重復讀(repeatable-read)
串行化(serializable)

MVCC:多版本并發(fā)控制,和事務(wù)級別相關(guān)

指定事務(wù)隔離級別:

  • 服務(wù)器變量tx_isolation指定,默認為REPEATABLE-READ,可在GLOBAL和SESSION級進行設(shè)置
    SET tx_isolation=''
          READ-UNCOMMITTED
          READ-COMMITTED
          REPEATABLE-READ
          SERIALIZABLE
    
  • 服務(wù)器選項中指定
    vim /etc/my.cnf
    [mysqld]
    transaction-isolation=SERIALIZABLE
    
最后編輯于
?著作權(quán)歸作者所有,轉(zhuǎn)載或內(nèi)容合作請聯(lián)系作者
【社區(qū)內(nèi)容提示】社區(qū)部分內(nèi)容疑似由AI輔助生成,瀏覽時請結(jié)合常識與多方信息審慎甄別。
平臺聲明:文章內(nèi)容(如有圖片或視頻亦包括在內(nèi))由作者上傳并發(fā)布,文章內(nèi)容僅代表作者本人觀點,簡書系信息發(fā)布平臺,僅提供信息存儲服務(wù)。

相關(guān)閱讀更多精彩內(nèi)容

  • 本文我們將圍繞一下幾點進行分析 什么是事務(wù)? 為什么需要隔離性? 事務(wù)的隔離級別有哪幾種?怎么設(shè)置? 隔離級別的實...
    一歲一枯榮啊閱讀 360評論 0 1
  • 1、ACID 事務(wù)是數(shù)據(jù)庫區(qū)別于文件系統(tǒng)的重要特性之一。 InnoDB的事務(wù)完全符合ACID特性。 原子性(Ato...
    冰河winner閱讀 1,157評論 0 2
  • 前言 MySQL事務(wù)主要用于處理一個包含操作量比較大、復雜的業(yè)務(wù)。比如說,刪除一個學生,我們除了要刪除該學生的基本...
    AlicFeng閱讀 2,900評論 0 1
  • 1. 事務(wù)特性 原子性 事務(wù)的原子性是指,事務(wù)包含一些列的原子性操作,且其執(zhí)行結(jié)果只能是:全部成功或者全部失敗,不...
    猿來是八阿哥閱讀 179評論 0 1
  • Jim Gray在1981年提出《The Transaction of Concept》由此正式拉開數(shù)據(jù)庫支持事務(wù)...
    Sophie12138閱讀 225評論 0 0

友情鏈接更多精彩內(nèi)容