1:定義
事務處理就是將一系列操作當做一個原子操作,要麼全部執行成功,如果執行失敗則保留執行期的狀態。通過提交和回滾機制來實現操作,如果全部執行成功通過提交執行commit結果就會記錄到數據庫中,如果執行失敗通過回滾操作rollback將發生錯誤之前的所有錯誤消除,回退到原來狀態。說白了要做到無可挑剔的完美成功否則出一點錯誤都恢復到原來的現狀。
2:四個特徵
原子性(Atomicity)
原子性是指事務包含的所有操作要麼全部成功,要麼全部失敗回滾(回到原來的狀態)。事務的操作如果成功就必須要完全應用到數據庫,如果操作失敗則不能對數據庫有任何影響。一致性(Consistency)
一致性是指事務必須使數據庫從一個一致性狀態變換到另一個一致性狀態,也就是說一個事務執行之前和執行之後都必須處於一致性狀態。拿轉賬來說,假設用戶A和用戶B兩者的錢加起來一共是5000,那麼不管A和B之間如何轉賬,轉幾次賬,事務結束後兩個用戶的錢相加起來應該還得是5000,這就是事務的一致性。
隔離性(Isolation)
隔離性是當多個用戶併發訪問數據庫時,比如操作同一張表時,數據庫爲每一個用戶開啓的事務,不能被其他事務的操作所幹擾,多個併發事務之間要相互隔離。即要達到這麼一種效果:對於任意兩個併發的事務T1和T2,在事務T1看來,T2要麼在T1開始之前就已經結束,要麼在T1結束之後纔開始,這樣每個事務都感覺不到有其他事務在併發地執行。
持久性(Durability)
持久性是指一個事務一旦被提交了,那麼對數據庫中的數據的改變就是永久性的,即便是在數據庫系統遇到故障的情況下也不會丟失提交事務的操作。例如我們在使用JDBC操作數據庫時,在提交事務方法後,提示用戶事務操作完成,當我們程序執行完成直到看到提示後,就可以認定事務以及正確提交,即使這時候數據庫出現了問題,也必須要將我們的事務完全執行完成,否則就會造成我們看到提示事務處理完畢,但是數據庫因爲故障而沒有執行事務的重大錯誤。
在這裏我創建了兩個表(product商品表和orders訂單表)
orders訂單表
mysql> select * from orders;
-> $
+—–+—–+——+
| oid | gid | much |
+—–+—–+——+
| 4 | 2 | 10 |
+—–+—–+——+
1 row in set
mysql> select * from product;
-> $
+—-+——+—–+
| id | name | num |
+—-+——+—–+
| 1 | 牛 | 57 |
| 2 | 羊 | 75 |
| 3 | 豬 | 75 |
+—-+——+—–+
3 rows in set
輸入開啓事務 start transaction;的語句
mysql> start transaction;
-> $
Query OK, 0 rows affected
輸入修改order訂單表語句
mysql> update product set num=60 where id = 1;
-> $
Query OK, 1 row affected
Rows matched: 1 Changed: 1 Warnings: 0
結果顯示:
mysql> select * from product;
-> $
+—-+——+—–+
| id | name | num |
+—-+——+—–+
| 1 | 牛 | 60 |
| 2 | 羊 | 75 |
| 3 | 豬 | 75 |
+—-+——+—–+
3 rows in set
如果我輸入回滾 rollback語句,數據會恢復到原狀,原來修改的牛的數量60撤銷會原來的57
mysql> select * from product;
-> $
+—-+——+—–+
| id | name | num |
+—-+——+—–+
| 1 | 牛 | 57 |
| 2 | 羊 | 75 |
| 3 | 豬 | 75 |
+—-+——+—–+
3 rows in set
如果我輸入提交 commit語句,改變的結果會保留在數據庫,持久不變。
mysql> commit;
-> $
Query OK, 0 rows affected
mysql> select * from product;
-> $
+—-+——+—–+
| id | name | num |
+—-+——+—–+
| 1 | 牛 | 60 |
| 2 | 羊 | 75 |
| 3 | 豬 | 75 |
+—-+——+—–+
3 rows in set