日韩性视频-久久久蜜桃-www中文字幕-在线中文字幕av-亚洲欧美一区二区三区四区-撸久久-香蕉视频一区-久久无码精品丰满人妻-国产高潮av-激情福利社-日韩av网址大全-国产精品久久999-日本五十路在线-性欧美在线-久久99精品波多结衣一区-男女午夜免费视频-黑人极品ⅴideos精品欧美棵-人人妻人人澡人人爽精品欧美一区-日韩一区在线看-欧美a级在线免费观看

歡迎訪問 生活随笔!

生活随笔

當(dāng)前位置: 首頁 > 运维知识 > 数据库 >内容正文

数据库

数据库事务和并发控制

發(fā)布時間:2024/2/28 数据库 25 豆豆
生活随笔 收集整理的這篇文章主要介紹了 数据库事务和并发控制 小編覺得挺不錯的,現(xiàn)在分享給大家,幫大家做個參考.

事務(wù)特征(ACID):

  • 原子性:事務(wù)的操作要么全做要么全不做。
  • 一致性:事務(wù)操作的結(jié)果是一個一致狀態(tài)轉(zhuǎn)換到另一個一致狀態(tài)。
  • 隔離性:一個事務(wù)的執(zhí)行過程不能受到其他事務(wù)的干擾。
  • 持久性:事務(wù)一旦提交,對數(shù)據(jù)庫做出的更新將是永久的。
  • 并發(fā)產(chǎn)生問題:

  • 丟失修改:修改的數(shù)據(jù)被覆蓋
  • 臟讀:讀取到未提交的數(shù)據(jù)。
  • 不可重復(fù)讀:同一個事務(wù)兩次讀結(jié)果不一致。
  • 幻讀:一個事務(wù)讀到了另一個事務(wù)中insert的數(shù)據(jù),好像出現(xiàn)了幻覺。
  • 數(shù)據(jù)庫的隔離級別:

    并發(fā)控制的技術(shù):

    • 數(shù)據(jù)庫鎖

      排它鎖(X鎖):寫鎖,一個事務(wù)獲取了寫鎖,則其他事務(wù)都不能再加任何類型的鎖,直到鎖釋放。

      共享鎖(S鎖):讀鎖,一個事務(wù)獲取了讀鎖,其他事務(wù)能加讀鎖,不能加寫鎖。

    (1) 鎖協(xié)議:
    1、一級封鎖協(xié)議:事務(wù)在修改數(shù)據(jù)前先加寫鎖,直到事務(wù)結(jié)束。(防止更新丟失)
    2、二級封鎖協(xié)議:在一級的基礎(chǔ)上,事務(wù)讀數(shù)據(jù)先加讀鎖,讀完釋放讀鎖。(防止臟讀)
    3、三級封鎖協(xié)議:在一級的基礎(chǔ)上,事務(wù)讀數(shù)據(jù)先加讀鎖,直到事務(wù)結(jié)束釋放。(防止不可重復(fù)讀)

    (2)兩端封鎖協(xié)議:事務(wù)執(zhí)行過程中,不允許加鎖釋放鎖交叉執(zhí)行。

    加鎖階段:在該階段可以進(jìn)行加鎖操作。在對任何數(shù)據(jù)進(jìn)行讀操作之前要申請并獲得S鎖,在進(jìn)行寫操作之前要申請并獲得X鎖。加鎖不成功,則事務(wù)進(jìn)入等待狀態(tài),直到加鎖成功才繼續(xù)執(zhí)行。

    解鎖階段:當(dāng)事務(wù)釋放了一個封鎖以后,事務(wù)進(jìn)入解鎖階段,在該階段只能進(jìn)行解鎖操作不能再進(jìn)行加鎖操作。

    兩段封鎖法可以這樣來實(shí)現(xiàn):事務(wù)開始后就處于加鎖階段,一直到執(zhí)行ROLLBACK和COMMIT之前都是加鎖階段。ROLLBACK和COMMIT使事務(wù)進(jìn)入解鎖階段

    (3)InnoDB行鎖算法:
    行記錄鎖:
    間隙鎖:鎖定一個范圍。
    next-key lock: 鎖定一個范圍,并鎖定記錄。

    • 寫時復(fù)制:讀操作一般遠(yuǎn)遠(yuǎn)超過寫操作,COW讀操作不用加鎖,極大提高讀取性能。

    • 多版本并發(fā)控制

      MVCC可以提供基于某個時間點(diǎn)的快照,使得對于事務(wù)看來,總是可以提供與事務(wù)開始時刻相一致的數(shù)據(jù),而不管這個事務(wù)執(zhí)行的時間有多長.所以在不同的事務(wù)看來,同一時刻看到的相同行的數(shù)據(jù)可能是不一樣的,即一個行可能有多個版本。

      為了實(shí)現(xiàn)mvcc, innodb對每一行都加上了兩個隱含的列,其中一列存儲行被更新的”時間”,另外一列存儲行被刪除的”時間”. 但是innodb存儲的并不是絕對的時間,而是與時間對應(yīng)的數(shù)據(jù)庫系統(tǒng)的版本號,每當(dāng)一個事務(wù)開始的時候,innodb都會給這個事務(wù)分配一個遞增的版本號,所以版本號也可以被認(rèn)為是事務(wù)號.對于每一個”查詢”語句,innodb都會把這個查詢語句的版本號同這個查詢語句遇到的行的版本號進(jìn)行對比,然后結(jié)合不同的事務(wù)隔離等級,來決定是否返回該行.

    鎖帶來的問題:

    1、活鎖:
    某一事務(wù)一直在等待鎖。采用先來先服務(wù)的策略。
    2、死鎖:
    事務(wù)互相等待鎖。
    預(yù)防:一次將所有需要的數(shù)據(jù)全部加鎖;規(guī)定一個封鎖順序
    診斷死鎖并解除:超時法;等待圖法,如果有環(huán)則有死鎖。解除死鎖:選擇回滾代價最小的事務(wù);回滾多遠(yuǎn);避免餓死。

    鎖的粒度越大,能夠封鎖的單元就越少,其并發(fā)度越低,系統(tǒng)開銷越小。一個系統(tǒng)支持多個封鎖粒度供不同的事務(wù)選擇,叫多粒度封鎖。

    多粒度鎖協(xié)議:對一個結(jié)點(diǎn)加鎖意味著這個節(jié)點(diǎn)的所有后裔節(jié)點(diǎn)都被加同樣的鎖。顯示封鎖:直接加到數(shù)據(jù)對象的鎖,隱式封鎖:該數(shù)據(jù)對象是由于上級節(jié)點(diǎn)加鎖而加上的鎖。

    意向鎖:對任意節(jié)點(diǎn)加鎖,就必須先對它的上層節(jié)點(diǎn)加意向鎖。意向共享鎖,意向排他所,共享意向排他鎖。

    總結(jié)

    以上是生活随笔為你收集整理的数据库事务和并发控制的全部內(nèi)容,希望文章能夠幫你解決所遇到的問題。

    如果覺得生活随笔網(wǎng)站內(nèi)容還不錯,歡迎將生活随笔推薦給好友。