資料庫交易的ACID特性中的隔離性(Isolation)定義當一筆資料同時被多個交易存取時產生的影響程度。ANSI SQL-92文件中定義了四種隔離層級(isolation level):
- READ UNCOMMITTED(未提交讀)
- READ COMMITTED(提交讀)
- REPEATABLE READ(可重覆讀)
- SERIALIZABLE(可序列化)
四種隔離層級為對併發交易(同時間發生多筆交易)造成的三種現象的隔離程度:
- P1 ("Dirty read")(髒讀):T1交易更新一筆資料但未提交,同時T2交易可讀取該筆T1更新但尚未提交的資料,如果T1 rollback了,則T2讀取的資料就是錯的。
- P2 ("Non-repeatable read")(不重覆讀):T1讀取一筆資料,接著T2修改該筆資料且提交,然後T1再重讀該筆資料發現該筆資料被修改了。
- P3 ("Phantom")(幻讀):T1讀取某條件下的一組資料,接著T2新增/刪除一或多筆資料滿足T1的查詢條件,然後T1又重複相同的查詢卻獲得不同的筆數。
下表說明了四種隔離層級對上述三種現象的隔離程度。Y代表可能發生,N則否。
Isolation levels | P1 Dirty read 髒讀 |
P2 Non-repeatable read 不重覆讀 |
P3 Phantom read 幻讀 |
---|---|---|---|
READ UNCOMMITTED 未提交讀 |
Y | Y | Y |
READ COMMITTED 提交讀 |
N | Y | Y |
REPEATABLE READ 可重覆讀 |
N | N | Y |
SERIALIZABLE 可序列化 |
N | N | N |
以上隔離層級在Spring框架分別對映到@Transactional
屬性isolation
的四種設定。
- Isolation.READ_UNCOMMITTED
- Isolation.READ_COMMITTED
- Isolation.REPEATABLE_READ
- Isolation.SERIALIZABLE
沒有留言:
張貼留言