数据库事务的四大特征
目錄
- 數據庫事務的四大特征
- 原子性
- 一致性
- 隔離性
- 持久性
- Read uncommitted
- 分析:
- Read committed
- 分析:
- Repeatable read
- 分析:
- 什么時候出現幻讀?
- Serializable序列化
數據庫事務的四大特征
原子性
指事物包含的所有操作要么全部成功,要么全部回滾。
一致性
指事物必須是數據庫從一個一致性狀態到另一個一致性狀態。也就是說一個事物執行之前和執行之后都必須處于一致性狀態。
隔離性
當多個用戶并發訪問數據庫時,比如操作同一張表時,數據庫為每一個用戶開啟的事務,不能被其他事務的操作所干擾,多個并發事物之間要相互隔離。
關于事務的隔離性數據庫提供了多種隔離級別,下面就是。。。
持久性
指事務一旦被提交,那么數據庫的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失事務的操作。
數據庫事務的隔離級別有4種,由低到高分別是:Read uncommitted、Read committed、Repeatablead、Serializable。事物的并發操作中可能休閑臟讀,不可重復讀,幻讀。
Read uncommitted
讀 未提交,就是一個事務可以讀取另一個未提交事務的數據。
eg: 老板要給程序員發工資,程序員的工資是3.6萬/月。但是發工資時老板不小心按錯了數字,按成3.9萬/月,該錢已經打到程序員的戶口,但是事務還沒有提交,就在這時,程序員去查看自己這個月的工資,發現比往常多了3千元,以為漲工資了非常高興。但是老板及時發現了不對,馬上回滾差點就提交了的事務,將數字改成3.6萬再提交。
分析:
實際程序員這個月工資還是3.6萬,但是程序員看到的是3.9萬,他看到的是老板沒提交事物的數據。就是臟讀。
解決方法:Read commited讀提交,能解決臟讀問題。
Read committed
讀 提交,就是事務要等另一個事物提交后才能讀取數據
eg: 程序員拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(程序員事務開啟),收費系統事先檢測到他的卡里有3.6萬,就在這個時候!!程序員的妻子要把錢全部轉出充當家用,并提交。當收費系統準備扣款時,再檢測卡里的金額,發現已經沒錢了(第二次檢測金額當然要等待妻子轉出金額事務提交完)。程序員就會很郁悶,明明卡里是有錢的…
分析:
這就是讀提交,若有事務對數據進行更新(UPDATE)操作時,讀操作事物要等這個更新操作事物提交才能讀取數據,可以解決臟讀問題。但在這個示例中,出現了一個事物范圍內兩個相同的查詢卻返回了不同數據,這就是不可重復讀。
解決方法:Repeatable read
Repeatable read
重復讀,就是在開始讀取數據(事物開啟)時,不再允許修改操作。MySQL是這一級別。
eg: 程序員拿著信用卡去享受生活(卡里當然是只有3.6萬),當他埋單時(事務開啟,不允許其他事務的UPDATE修改操作),收費系統事先檢測到他的卡里有3.6萬。這個時候他的妻子不能轉出金額了。接下來收費系統就可以扣款了。
分析:
重復讀可以解決不可重復讀問題。寫到這里,應該明白一點就是,不可重復讀對應的是修改 UPDATE操作。但是可能會有幻讀問題。因為幻讀問題對應的是插入INSERT操作,而不是UPDATE操作。
什么時候出現幻讀?
eg: 程序員某一天消費,花了2千元,然后他的妻子去查看他今天的消費記錄(全表掃描FTS,妻子事物開啟),看到確實是花了2千元,就在這個時候,程序員花了1萬元買了一臺電腦,即新增INSERT了一條消費記錄,并提交。當妻子打印程序員的消費記錄清單時(妻子提交事務),發現花了1.2萬元,似乎出現了幻讀,就是幻讀。
解決:Serializable
Serializable序列化
Serializable是最高的事務隔離級別,在該級別下,事務串行化順序執行,可以避免臟讀,不可重復讀與幻讀。但是這種事務隔離級別效率低下,比較耗數據庫性能,一般不用。
大多數數據庫默認的事務級別隔離級別是Read committed、比如Sql Server,Oracle。Mysql的默認級別是Repeatable read
123
總結
以上是生活随笔為你收集整理的数据库事务的四大特征的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: 从上往下打印出二叉树的每个节点,同层节点
- 下一篇: mybatis框架中的queryWrap