關於數據庫事務的分類和特性

一、特性

  1. 原子性:事務中的所有操作要麼全部成功,要麼全部失敗。
  2. 持久性:事務一旦提交,對數據庫的影響就是持久性的。
  3. 一致性:事務必須使數據庫從一個一致性狀態轉換爲另一個一致性狀態。也就是事務執行前後狀態保持一致。
  4. 隔離性:多個併發事務之間相互隔離。

二、隔離級別

  1. 髒讀:併發事務之間一個事務讀取了另一個事務還未提交的數據。
  2. 不可重複讀:併發事務間一個事務多次讀取,分別讀取了另一個事務未提交和已經提交的數據,導致多次讀取的數據狀態不一致。
  3. 幻讀:併發事務間一個事務讀取了另一個事務已經提交的數據。與不可重複讀的區別是不可重複讀前後讀取的是同一數據項,而幻讀是一批數據。比如前後讀取的數據數量不一致。

三、MySQL數據庫四大隔離級別

  1. Serializable(串行化):可避免髒讀、不可重複讀、幻讀的發生。
  2. Repeatable Read(可重複讀):可避免髒讀、不可重複讀的發生。
  3. Read Committed(讀已提交):可避免髒讀的發生。
  4. Read unCommitted:(讀未提交):最低級別,任何情況都會發生。

四、Spring事務管理

  1. TransactionDefinition.ISOLATION_DEFAULT:這是默認值,表示使用底層數據庫的默認隔離級別。對大部分數據庫而言,通常這值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
  2. TransactionDefinition.ISOLATION_READ_UNCOMMITTED:該隔離級別表示一個事務可以讀取另一個事務修改但還沒有提交的數據。該級別不能防止髒讀,不可重複讀和幻讀,因此很少使用該隔離級別。
  3. TransactionDefinition.ISOLATION_READ_COMMITTED:該隔離級別表示一個事務只能讀取另一個事務已經提交的數據。該級別可以防止髒讀,這也是大多數情況下的推薦值。
  4. TransactionDefinition.ISOLATION_REPEATABLE_READ:該隔離級別表示一個事務在整個過程中可以多次重複執行某個查詢,並且每次返回的記錄都相同。該級別可以防止髒讀和不可重複讀。
  5. TransactionDefinition.ISOLATION_SERIALIZABLE:所有的事務依次逐個執行,這樣事務之間就完全不可能產生干擾,也就是說,該級別可以防止髒讀、不可重複讀以及幻讀。但是這將嚴重影響程序的性能。通常情況下也不會用到該級別。

五、Spring事務的傳播行爲

  1. TransactionDefinition.PROPAGATION_REQUIRED:如果當前事務存在,則加入當前事務;如果不存在,則創建一個新的事務。一般默認此項。
  2. TransactionDefinition.PROPAGATION_REQUIRES_NEW:創建一個新的事務,如果當前事務存在,則掛起當前事務。
  3. TransactionDefinition.PROPAGATION_SUPPORTS:如果當前存在事務,則加入該事物;如果事務不存在,則以非事務方式執行。
  4. TransactionDefinition.PROPAGATION_NOT_SUPPORTED:以非事務方式執行,如果當前事務存在,則掛起當前事務。
  5. TransactionDefinition.PROPAGATION_NEVER:以非事務方式執行,如果存在事務,則拋出異常。
  6. TransactionDefinition.PROPAGATION_MANDATORY:如果當前存在事務,則加入當前事務;如果不存在,則拋出異常。
  7. TransactionDefinition.PROPAGATION_NESTED:如果當前存在事務,則創建一個新的事務作爲當前事務內嵌事務執行,如果不存在,則取該值等價於TransactionDefinition.PROPAGATION_REQUIRED,即創建一個新的事務。
發表評論
所有評論
還沒有人評論,想成為第一個評論的人麼? 請在上方評論欄輸入並且點擊發布.
相關文章