1. 程式人生 > >MYSQL 事務

MYSQL 事務

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 事務