java之MySQL事务处理
廢話不多說,直接看圖:
上面就是一個簡單的事務流程 ,其實呢,在我們平時操作的MySQL語句都涉及到了事務處理,每一條語句都是一個事務,mysql客戶端默認是開啟了自動提交事務,可以這樣查看:
上面1就是開啟自動提交事務,當我們提交sql語句的時候,mysql就自動幫我們commit了。我們可以馬上就會查看到相應的結果。
我們可以關閉上面的自動提交事務,可以如下設置:
0就代表關閉了自動提交。
那么我們展示一下,關閉了自動提交之后,語句會怎么處理,說一下,你要看MySQL語句執行之后的處理情況,就必須通過兩個客戶端操作才能看到處理情況,一個客戶端語句處理,一個展示,不要在一個客戶端展示效果。
關閉自動提交之后:
先在一個客戶端看一下這張表的原始情況,然后我們在執行一下操作:
我們把這里是想把李四的錢 - 500變成和張三一樣。
上面操作執行了,從另外一個客戶端查看表的數據情況:
?
看吧,數據好像沒有改變,原因在于我們沒有commit數據。
我們從操作客戶端提交一下數據:
?
然后在從另外一個客戶端查看數據情況:
?
上面數據就改過來了,也就是說,當沒有設置自動提交事務,每一條語句我們就只能手動提交。
?下面說一下事務處理原理:
?下面說一下這個回滾點的操作:
回滾:一聽就是回到相應的位置
你自己設置一個相應的位置設置回滾點就行,自己定義
下面說一下事務的隔離級別:
?
在我們程序運行的過程中,用戶對數據庫的訪問都是并發的,也就是說,會出現多個用戶訪問同一個數據的問題,簡單說就是,會出現多個事務之間相互干擾的問題:
下面說一下mysql的四種隔離級別:
?
?下面說一下隔離級別的相關命令:
比如我們查看當下客戶端事務的隔離級別:
很明顯是不是可重復讀。
同樣我們可以設置事務的隔離級別:
?
設置之后,必須重新啟動客戶端:
?
?下面我們展示一下臟讀的問題,這都是并發造成的問題,多個用戶訪問同一個數據,事務隔離級別低:
先把事務隔離性設置為read uncommitted,設置方法如上,讀未提交,這樣才會產生臟讀問題:
我們先來看一下全是數據表的數據:
既然是多個用戶來操作數據,那么我們建立兩個客戶端:
兩個窗口都開啟事務:
?我們在左邊這個窗口更新一下數據,一個賬戶加500,一個賬戶減500,未提交:
?
然后在右邊的窗口查詢一下賬戶:
?
和明顯,讀取到了另外一個事務未提交的數據,應該就是從臨時日志取出來的。
然后把左邊窗口回滾一下:
右邊窗口錢就沒了:
?
?上面就明顯看到數據安全性非常不高,比如右邊向左邊支付500,左邊一看錢到了,然后右邊一rollback,左邊錢就沒了。
解決臟讀問題很簡單:提升安全級別,只有讀未提交才產生臟讀,比如改成讀已提交
來說一下,不可重復讀演示,演示不可重復讀,必須把事務隔離級別設置成read committed
不可重復讀:一個事務中,兩次讀取的內容是不一樣的。
開啟兩個窗口,還是把事務打開.
我們來看一下原始數據:
還是在左邊的窗口更新數據,注意把數據提交
?
右邊的窗口 查詢一下:
這個時候,就會出現數據讀取不一致的問題。
如何解決不可重復讀的問題,就隔離級別提升為repeatable read
?同一個事務中,要保證數據一致性,必須使用repeatable read級別來讀取數據。
下面簡單說一下幻讀:
使用serializable隔離級別,就會阻止幻讀的產生,開啟了seriable隔離級別,一個事務就會等待另外一個事務commit之后才會執行當前操作。
?
總結
以上是生活随笔為你收集整理的java之MySQL事务处理的全部內容,希望文章能夠幫你解決所遇到的問題。
- 上一篇: python/numpy随机选取训练集/
- 下一篇: mysql 提交事务_MySQL事务提交