事務(transaction):指的是一組操作,裡面可以包含許多個單一的邏輯,只要有乙個邏輯沒有執行成功,都算執行失敗,所有資料回到最初的狀態(回滾)
*確保事務中的所有操作都執行成功,將結果提交(commit)
*只要有乙個操作沒有執行成功,所有的操作都算執行失敗,所有的資料回到最初的狀態(rollback)
1、事務的特性(acid)
(1)原子性(atomicity):事務中的邏輯要全部執行,不可分割
(2)一致性(consistent):事務執行前和執行後,資料的完整性保持一致
(3)隔離性(isolation):事務在執行期間不應該受到其他事務的影響
(4)永續性(durable):事務執行結束(提交或回滾),資料都應持久化到磁碟上
2、事務的隔離程度
(1)read uncommitted(讀未提交):乙個事務可以讀到另乙個事務還沒提交的資料(導致髒讀)
(2)read committed(讀已提交):乙個事務可以讀到另乙個事務已提交的資料,造成了前後兩次查詢結果不一致,一次是在另乙個事務提交資料之前查詢,一次是在另乙個事務提交資料之後查詢(解決髒讀,導致不可重複讀)
(3)repeatable read(可重複讀):乙個事務的操作不會受到另乙個事務的操作的影響(兩個事務可以同時執行)(解決髒讀和不可重複讀,未解決幻讀)
(4)serializable(可序列化):誰先開啟事務,誰就有先執行的權利,後開啟的事務必須等前乙個事務提交或回滾後,才能執行(兩個事務必須依次執行)(解決髒讀、不可重複讀和幻讀)
特別說明:
(1)mysql預設(可重複讀)、oracle預設(讀已提交)
(2)按效率劃分:read uncommitted> read committed> repeatable read> serializable
(3)按攔截程度劃分:read uncommitted< read committed< repeatable read< serializable
3、事務的安全隱患
(1)讀的問題
髒讀:乙個事務讀到另乙個事務還沒提交的資料
不可重複讀:乙個事務讀到另乙個事務已提交的資料,造成了前後兩次查詢結果不一致
幻讀:乙個事務讀到另乙個事務insert的資料,導致前後查詢結果不一致
特別說明:
不可重複讀:重點在於提交。前乙個事務讀到後乙個事務已提交的資料,不管後乙個事務是insert、delete還是update,都會導致前乙個事務在後乙個事務提交前和提交後的查詢結果不一致
幻讀:重點在於乙個事務本身前後查詢的結果不一致。舉個例子:一張表中有十條資料,內容都是name:張三,age:18,事務a將所有的name由張三改為李四,與此同時,事務b插入了一條資料,內容也是name:張三,age:18,事務a提交資料之後查詢發現莫名其妙多一條資料沒有修改,由此產生「幻覺」
(2)寫的問題:
丟失更新:
事務a、事務b開啟事務後,對同一資料做了不同方面的修改,比如最初的資料是:張三,18歲
事務a將名字由張三改為李四,事務b將年齡由18歲改為28歲,事務a提交資料之後,事務b也提交了資料
修改後的資料是:張三,28歲
這樣事務a就丟失了更新的資料
4、幾條命令
(1)設定隔離級別:
set session transaction isolation levelread uncommitted;
(2)檢視隔離級別:
select @@ transaction_isolation;(新版本8.0+)
select @@ tx_isolation;(老版本)
(3)設定自動提交:資料庫一般都設定自動提交autocommit(值為on)
set autocommit=off;
(4)開啟事務:
start transaction;
(5)提交/回滾
commit/rollback
關於volatile的幾點理解
volatile翻譯成中文就是不穩定的 反覆無常的。它的功能簡單地說就是防止編譯器對 進行優化。比如如下程式 1 234 xbyte 2 0x55 xbyte 2 0x56 xbyte 2 0x57 xbyte 2 0x58 對外部硬體而言,上述四條語句分別表示不同的操作,會產生四種不同的動作,但是...
關於職場成功的幾點理解
每個人都渴望在職場獲得成功,如何取得成功,取決於很多因素,下面是兩點理解 1.工作保持持續成功。如果想在職場取得成功,需要在工作上保持持續成功,假如是pm,那麼要保持負責的專案能夠持續成功,如果每個專案有進步,就為自己職場成功奠定了基礎。這樣需要培養自己能夠持續成功的能力,包括自身素質提高,人際網路...
關於職場成功的幾點理解
每個人都渴望在職場獲得成功,如何取得成功,取決於很多因素,下面是兩點理解 1.工作保持持續成功。如果想在職場取得成功,需要在工作上保持持續成功,假如是pm,那麼要保持負責的專案能夠持續成功,如果每個專案有進步,就為自己職場成功奠定了基礎。這樣需要培養自己能夠持續成功的能力,包括自身素質提高,人際網路...