Java資料型別自動轉換(++ ,+=)
一、什麼是事務,為什麼需要使用事務
1、什麼是事務
事務是資料庫執行的基本單位,是指對資料庫進行讀或寫的一個操作序列,這些操作要麼全部成功,要麼全部失敗,是一個不可分割的工作單位.
2、為什麼要使用事務
可以保證資料的一致性和完整性.
二、MySQL中的事務
1、MySQL中預設採用的是自動提交(autocommit)模式,如下所示:
在自動模式下,每條sql語句都會被當做一個事務執行提交操作.
2、在MySQL中可以通過如下方法關閉autocommit(也就是不再使用MySQL預設的事務,顯式開啟事務),需要注意的是,autocommit針對的是當前連線,在當前連線中修改了參
數,不會對其它的連線產生任何影響.
如果顯示的開啟了事務,具體的操作步驟如下:
1 start transaction;
2 一條或者多條SQL語句;
3 commit;
4 [rollback;]
其中start transaction標識事務的開始,commit標識提交事務,將執行結果寫入資料庫,如果SQL語句執行出現問題,會呼叫rollback,回滾所有已經執行成功的SQL
語句,當然也可以在事務中直接使用rollback語句進行回滾.
特別注意:在MySQL中存在一些特殊的命令,如果在事務中執行了這些命令,會馬上強制執行commit提交事務;例如DDL語句(create|drop|alter table)、lock tables等.不過DQL(select)、DML(insert、delete、update)命令都不會強制執行commit提交事務.
三、ACID特性
1、原子性
2、一致性
3、隔離性
隔離性是指,事務內部的操作和其它事務是隔離的,併發執行的各個事務之間不能互相干擾,嚴格的隔離性對應的是事務隔離級別中的Serializable(序列化),但是實際應用
中出於對效能方面的考慮,基本不會使用序列化.
在討論隔離性之前我們首先來看一下併發情況下讀操作可能會出現的問題.
(1)、髒讀:事務A讀到了事務B中未提交的資料.
時間 | 事務A | 事務B |
T1 | 開啟事務 | 開啟事務 |
T2 | 將Venus的餘額由100修改為200 | |
T3 | 查詢Venus的餘額,顯示為200 | |
T4 |
事務B開啟了事務,執行了修改操作,但是並沒有執行commit操作,而這個時候事務A中切讀取到了事務B未提交的資料,這種現象稱為髒讀.
(2)、不可重複讀:事務A兩次讀取到的資料不一樣.髒讀和不可重複讀的區別是,髒讀讀取的資料是未提交的資料,而不可重複讀讀取到的資料是已經提交的資料.
時間 | 事務A | 事務B |
T1 | 開啟事務 | 開啟事務 |
T2 | 查詢Venus的餘額為100 | |
T3 | 修改Venus的餘額,將100改成200 | |
T4 | 提交事務 | |
T5 | 查詢到Venus的餘額為200 |
事務A第一次讀取到的餘額為100,而第二次讀取到的餘額為200,我們把這種兩次讀取到的資料不一致的現象稱為不可重複讀.
(3)、虛讀(幻讀):事務A兩次按照一定的條件查詢資料庫,兩次查詢的結果行數不一致.不可重複讀和虛讀的區別是,不可重複讀是兩次查詢到的結果內容不一致
而虛讀是兩次查詢的結果行數不一致.
時間 | 事務A | 事務B |
T1 | 開啟事務 | 開啟事務 |
T2 | 查詢結果 0<id<5的餘額 Venus:100 [id=1] | |
T3 | 新增使用者Mercury:200 [id=2] | |
T4 | 提交事務 | |
T5 |
查詢結果 0<id<5的餘額 Venus:100 [id=1] Mercury:200 [id=2] |
事務A第一次讀取到的資料只有Venus一條記錄,而第二次讀取到資料有Venus和Mercury兩條記錄,第一次查詢和第二次查詢得到的資料條數不同,這種現象
稱為虛讀或者也稱為幻讀.
1、隔離級別
資料庫事務的隔離級別有四種,由低到高分別是 Read Uncommitted、Read Committed、Repeatable Read、Serializable.
其中MySQL的預設隔離級別是 Repeatable Read,可以通過下面查詢語句查詢出(MySQL5.x和MySQL8.x查詢的語句有變化,這裡以8.x演示)
1.1、Read Uncommitted
讀未提交:顧名思義就是一個事務讀取到了另一個事務未提交的
時間 | 事務A | 事務B |
T1 | 開始事務(START TRANSACTION) | 開始事務(START TRANSACTION) |
T2 | ||
T3 | ||
T4 |
4、永續性