事務(ACID)的特性:
- 原子性:一系列操作,要麼一起成功,要麼全部失敗(單線程批量操作)
- 一致性:多線程同時修改同一數據時,最終結果和操作的動作需要保持一致(多線程操作)
- 隔離性:事務和事務之間的關係
- 持久性:事務提交之後數據庫的修改是永久性的
事務的操作:
- 開啓(start transaction):開啓事務
- 關閉事務兩種方式:
- 回滾(rollback):事務執行失敗,所執行的操作
- 提交(commit):事務操作無任何錯誤,將數據持久化的最後一步操作
事務操作和存儲過程(非事務性):
- 存儲過程所產生的結果無法進行回滾
- 事務操作一定程度上,能夠保證數據的安全性
事務的隔離級別
- serializable:(創建一個事務,另一個事務就不能開啓,可以同時避免髒讀、幻讀、不可重複讀)
- read-commited(Oracle默認的隔離級別):(讀取事務提交後的結果)
- read-uncommited(風險最大,效率最高):(可讀取事務未提交的結果)
- repeatable-read[default]:(同一條件查詢返回的結果永遠是一致的,無論事務是否提交)
事務隔離級別 |
髒讀 |
不可重複讀 |
幻讀 |
serializable |
N |
N |
N |
read-uncommitted |
Y |
Y |
Y |
read-committed |
N |
Y |
Y |
repeatable-read |
N |
N |
Y |
事務隔離性操作
- 修改當前命令行下的事務隔離性
MariaDB [db_job]> select @@tx_isolation;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.00 sec)
MariaDB [db_job]> set tx_isolation='serializable';
Query OK, 0 rows affected (0.00 sec)
MariaDB [db_job]> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE |
+----------------+
1 row in set (0.00 sec)
- 修改全局事務隔離性
MariaDB [db_job]> set global transaction isolation level serializable;
Query OK, 0 rows affected (0.00 sec)
MariaDB [db_job]> select @@tx_isolation;
+----------------+
| @@tx_isolation |
+----------------+
| SERIALIZABLE |
+----------------+
1 row in set (0.00 sec)