事務管理簡介

1.什麼是事務

事務通俗的講就是一件事情,要麼作完,要麼不作,事務是一個不可分割的總體 這也是事務的原子性mysql

事務的四大特性有:spring

  • 原子性 (Atomicity) -事務是不可分割的總體, 要麼所有成功, 要麼所有失敗sql

  • 一致性(Consistency)  -事務操做數據必須保證是一致性的數據庫

  • 隔離性(Isolation)  -事務之間是沒有任何干擾的, A事務的執行,不會影響B事務安全

  • 持久性(Durabiltiy)  -當執行一條insert語句以後,數據庫必須是保證永遠存放在磁盤中併發

原子性是基礎, 隔離性是手段, 持久性是目的,這三個特性都是爲了給「老大」「一致性」服務的sqlserver

2.事務的隔離級別

事務的四大隔離級別(Transaction Isolation Level)分爲:spa

  • READ_UNCOMMITED;//這是最低的隔離等級,容許其餘事務看到沒有提交的數據, 這種狀況會致使髒讀orm

  • READ_COMMITED;//被讀取的數據能夠被其餘事務修改,這樣會致使不可重複讀, mysql sqlserver 默認的隔離級別server

       事務A 先讀取了數據, 事務B接着更新了數據, 並提交了事務, 而事務A再次讀取數據時,數據已經發生了改變

       形成了不可重複讀

  • REPEATABLE_READ;//全部被select獲取的數據都不能被修改,這樣能夠避免一個事務先後讀取不一致的狀況

       事務A讀取與搜索條件匹配的若干行,事務B以插入或刪除等方式修改事務A的結果集, 而後提交, 事務A再讀取時

       卻發現了數據發生了變化, 形成了幻讀

  • SERIALIZABLE;//全部的事務都一個接一個的串行執行,這樣能夠避免幻讀

Mysql數據庫默認的事務隔離級別是READ_COMMITED

從上往下,級別愈來愈高,併發性愈來愈差,安全性愈來愈高


3.事務的傳播行爲

spring 一共提供了7種事務傳播行爲,分別是:

  • PROPAGATION_REQUIRED;

  • PROPAGATION_REQUIRED_NEW;

  • PROPAGATION_NESTED;

  • PROPAGATION_SUPPORTS;

  • PROPAGATION_NOT_SUPPORTED;

  • PROPAGATION_NEVER;

  • PROPAGATION_MANDATORY;

假設事務從方法A傳播到方法B,用戶須要面對方法B, 須要知道方法A有事務?

  1. 若是沒有,就新建一個事務,若是有,就加入當前事務,這就是PROPAGATION_REQUIRED,它是spring默認的事務傳播行爲

  2. 若是沒有,就新建一個事務,若是有,  就將當前事務掛起,這就是PROPAGATION_REQUIRED_NEW 從新建立新的事務

  3. 若是沒有,就新建一個事務,若是有,就在當前事務中嵌套其餘事務,這就是PROPAGATION_NESTED

  4. 若是沒有, 就以非事務的方式執行,若是有,就使用當前事務,這就是PROPAGATION_SUPPORTS

  5. 若是沒有, 就以非事務方式執行,若是有,就將當前事務掛起,, 這就是PROPAGATION_NOT_SUPPORTED

  6. 若是沒有, 就以非事務方式執行,若是有,就拋出異常,這就是PROPAGATION_NEVER

  7. 若是沒有, 就拋出異常,若是有, 就使用當前事務,這就是PROPAGATION_MANDATORY,沒有事務就直接報錯

4.數據庫鎖

數據庫中鎖主要分爲悲觀鎖與樂觀鎖:

悲觀鎖(Pessimistic Lock) 顧名思義, 就是很悲觀,, 每次去拿數據的時候都認爲別人會修改, 因此每次在拿數據的時候都會上鎖,

這樣別人想拿這個數據就會block直到它拿到鎖, 悲觀鎖分爲: 行鎖 和表鎖

行鎖: 鎖住單行的記錄

表鎖: 鎖住整個表的記錄


樂觀鎖(Optimistic Lock): 顧名思義,就是很樂觀, 每次去拿數據的時候都會認爲別人不會修改, 因此不會上鎖,可是在更新的

時候會判斷一下在此期間別人有沒有去更新這個數據, 可使用數據庫版本號的方式來判斷

相關文章
相關標籤/搜索