數據庫事務知識
-
事務的特性有四個
1.原子性(Atomicity)。即事務必須是一個不可分割的整體。事務中的操作要麼一起成功要麼一起失敗。
2.一致性(Consistency)。即執行完數據操作後,數據不會被破壞。
3.隔離性(Isolation)。即事務之間的隔離。
4.持久性(Durability)。即數據庫必須要保證每一條修改或插入數據都要永久地存放在磁盤中。
-
事務的隔離級別
1.READ_UNCOMMITTED。即事務A讀取了事務B中未提交的修改數據。這就出現了髒讀。
2.READ_COMMITTED。即事務A讀取了事務B提交的更改數據。這就出現了不可重複讀。
3.REPEATABLE_READ。即事務A讀取了事務B提交的新增數據。這就出現了幻讀。
4.SERIALIZABLE。此事務級別最高。解決了幻讀。
事務隔離級別 | 髒讀 | 不可重複讀 | 幻讀 |
---|---|---|---|
READ_UNCOMMITTED | 允許 | 允許 | 允許 |
READ_COMMITTED | 禁止 | 允許 | 允許 |
REPEATABLE_READ | 禁止 | 禁止 | 允許 |
SERIALIZABLE | 禁止 | 禁止 | 禁止 |
-
java查看數據庫默認事務隔離級別
Connection conn = DriverManager.getConnection(url, username, passowrd);
DatabaseMetaData meta = conn.getMetaData();
//事務隔離級別
int isolation = meta.getDetaultTransactionIsolation(); -
Spring事務傳播行爲
spring一共提供了7種事務傳播行爲。
1.PROPAGATION_REQUIRED 如果沒有事務,就新建一個事務;如果有事務,就加入當前事物。這也是Spring提供的默認事物傳播行爲。
2.PROPAGATION_REQUIRES_NEW 如果沒有事務,就新建一個事務;如果有事務,就將當前事務掛起。意思是創建了一個新事務,它和原來的事務沒有任何關係了。
3.PROPAGATION_NESTED 如果沒有事務,就新建一個事務;如果有事務,就在當前事務中嵌套其他事務,所嵌套的子事務與主事務之間有關聯的(當主事務提交或回滾,子事務也會提交或回滾)。
4.PROPAGATION_SUPPORTS 如果沒有事務,就以非事務方式執行;如果有事務,就使用當前事務。
5.PROPAGATION_NOT_SUPPORTED 如果沒有事務,就以非事務方式執行;如果有事務,就將當前事務掛起。
6.PROPAGATION_NEVER 如果沒有事務,就以非事務方式執行;如果有事務,就拋出異常。
7.PROPAGATION_MANDATORY 如果沒有事務,就拋出異常;如果有事務,就使用當前事務。
-
Spring 還提供了事務超時和只讀事務
1.事務超時(Transaction Timeout)——爲了解決事務時間太長,消耗太多資源的問題,所以故意給事務設置一個最大時長,如果超時了,就回滾事務。
2.只讀事務(Readonly Transaction)——爲了忽略那些不需要事務的方法,比如讀取數據,這樣可以有效地提高一些性能。