MYSQL 事務
阿新 • • 發佈:2017-12-18
log efault default 轉賬 之間 數據庫 一致性 desc ted
事務(Transaction):ts,一般是指要做的或所做的事情。
例如:轉賬問題。
mysql> create table ac (id int primary key auto_increment,
-> ac_name char(10),ac_money int);
Query OK, 0 rows affected (0.06 sec)//創建表
mysql> desc ac;
+----------+----------+------+-----+---------+----------------+
| Field | Type | Null | Key | Default | Extra |
+----------+----------+------+-----+---------+----------------+
| id | int(11) | NO | PRI | NULL | auto_increment |
| ac_name | char(10) | YES | | NULL | |
| ac_money | int(11) | YES | | NULL | |
+----------+----------+------+-----+---------+----------------+
3 rows in set (0.09 sec)
mysql> insert into ac values (null,"lucy",5000);
Query OK, 1 row affected (0.05 sec)
mysql> insert into ac values (null,"tom",2000);
Query OK, 1 row affected (0.01 sec)//插入數據
mysql> select * from ac;
+----+---------+----------+
| id | ac_name | ac_money |
+----+---------+----------+
| 1 | lucy | 5000 |
| 2 | tom | 2000 |
+----+---------+----------+
2 rows in set (0.00 sec)
//轉賬 lucy --->tom 1000
update ac set ac_money=ac_money-1000 where id=1;
update ac set ac_money=ac_money+1000 where id=2;
//事務的四個特性(ACID)(掌握和理解):
原子性(atomicity)。一個事務是一個不可分割的工作單位,事務中包括的諸操作要麽都做,要麽都不做。
一致性(consistency)。事務必須是使數據庫從一個一致性狀態變到另一個一致性狀態。一致性與原子性是密切相關的。
隔離性(isolation)。一個事務的執行不能被其他事務幹擾。即一個事務內部的操作及使用的數據對並發的其他事務是隔離的,並發執行的各個事務之間不能互相幹擾。
持久性(durability)。持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。
//mysql 事務的操作
//1.開啟事務
mysql> begin;
Query OK, 0 rows affected (0.05 sec)
//2.事務的提交(關閉)
mysql> commit;
Query OK, 0 rows affected (0.00 sec)
//3.事務的回滾(關閉)
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
//4.保存點
mysql> savepoint c;
Query OK, 0 rows affected (0.00 sec)
//5.回滾到保存點
mysql> rollback to savepoint c;
Query OK, 0 rows affected (0.00 sec)
//6.自動提交的設置
mysql> set autocommit=0;//則需要commit操作提交
Query OK, 0 rows affected (0.05 sec)
mysql> set autocommit=1;//則不需要commit操作提交
Query OK, 0 rows affected (0.00 sec)
----------------------------存在的問題-----------
臟讀:事務T1將某一值修改,然後事務T2讀取該值,此後T1因為某種原因撤銷對該值的修改,這就導致了T2所讀取到的數據是無效的。
不可重復讀:事務1第一次讀 A,事務2修改A為B,事務1 第二次讀到B
幻讀:事務B以插入或刪除行等方式來修改事務A的結果集,然後再提交。
以上問題的解決//事務的隔離級別
read uncommitted | 0 未提交讀 不解決問題
read committed | 1 已提交讀 可以解決臟讀
repeatable read | 2 可重復讀 避免臟讀,不可重復讀,
serializable | 3 可序列化 解決一切問題(並發)
---恢復內容結束---
MYSQL 事務