事務通俗的講就是一件事情,要麼作完,要麼不作,事務是一個不可分割的總體 這也是事務的原子性mysql
事務的四大特性有:spring
原子性 (Atomicity) -事務是不可分割的總體, 要麼所有成功, 要麼所有失敗sql
一致性(Consistency) -事務操做數據必須保證是一致性的數據庫
隔離性(Isolation) -事務之間是沒有任何干擾的, A事務的執行,不會影響B事務安全
持久性(Durabiltiy) -當執行一條insert語句以後,數據庫必須是保證永遠存放在磁盤中併發
原子性是基礎, 隔離性是手段, 持久性是目的,這三個特性都是爲了給「老大」「一致性」服務的sqlserver
事務的四大隔離級別(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
從上往下,級別愈來愈高,併發性愈來愈差,安全性愈來愈高
spring 一共提供了7種事務傳播行爲,分別是:
PROPAGATION_REQUIRED;
PROPAGATION_REQUIRED_NEW;
PROPAGATION_NESTED;
PROPAGATION_SUPPORTS;
PROPAGATION_NOT_SUPPORTED;
PROPAGATION_NEVER;
PROPAGATION_MANDATORY;
假設事務從方法A傳播到方法B,用戶須要面對方法B, 須要知道方法A有事務?
若是沒有,就新建一個事務,若是有,就加入當前事務,這就是PROPAGATION_REQUIRED,它是spring默認的事務傳播行爲
若是沒有,就新建一個事務,若是有, 就將當前事務掛起,這就是PROPAGATION_REQUIRED_NEW 從新建立新的事務
若是沒有,就新建一個事務,若是有,就在當前事務中嵌套其餘事務,這就是PROPAGATION_NESTED
若是沒有, 就以非事務的方式執行,若是有,就使用當前事務,這就是PROPAGATION_SUPPORTS
若是沒有, 就以非事務方式執行,若是有,就將當前事務掛起,, 這就是PROPAGATION_NOT_SUPPORTED
若是沒有, 就以非事務方式執行,若是有,就拋出異常,這就是PROPAGATION_NEVER
若是沒有, 就拋出異常,若是有, 就使用當前事務,這就是PROPAGATION_MANDATORY,沒有事務就直接報錯
數據庫中鎖主要分爲悲觀鎖與樂觀鎖:
悲觀鎖(Pessimistic Lock) 顧名思義, 就是很悲觀,, 每次去拿數據的時候都認爲別人會修改, 因此每次在拿數據的時候都會上鎖,
這樣別人想拿這個數據就會block直到它拿到鎖, 悲觀鎖分爲: 行鎖 和表鎖
行鎖: 鎖住單行的記錄
表鎖: 鎖住整個表的記錄
樂觀鎖(Optimistic Lock): 顧名思義,就是很樂觀, 每次去拿數據的時候都會認爲別人不會修改, 因此不會上鎖,可是在更新的
時候會判斷一下在此期間別人有沒有去更新這個數據, 可使用數據庫版本號的方式來判斷