Mysql事務


  事務是由一組SQL語句組成的邏輯處理單元,要么全部執行成功,要么全部執行不成功,例如銀行匯款。Mysql中只有innodb和bdb類型(數據庫引擎)的數據庫才能支持事務處理。

  事務處理可以確保非事務性單元的多個操作都能夠完成,否則不會更新數據資源。

(1).事務的特性

  1.原子性(atomicity)。一個事務(transaction)中的所有操作,要么全部完成,要么全部不完成,不會結束在中間某個環節。事務在執行過程中發生錯誤,會被回滾(Rollback)到事務開始前的狀態,就像這個事務從來沒有執行過一樣。

  2.一致性(consistency)。在事務開始之前和事務結束以后,數據庫的完整性沒有被破壞。這表示寫入的資料必須完全符合所有的預設規則,這包含資料的精確度、串聯性以及后續數據庫可以自發性地完成預定的工作。

  3.隔離性(isolation)。數據庫允許多個並發事務同時對其數據進行讀寫和修改的能力,隔離性可以防止多個事務並發執行時由於交叉執行而導致數據的不一致。事務隔離分為不同級別,包括讀未提交(Read uncommitted)、讀提交(read committed)、可重復讀(repeatable read)和串行化(Serializable)。

  4.持久性(durability)。持久性也稱永久性(permanence),指一個事務一旦提交,它對數據庫中數據的改變就應該是永久性的。接下來的其他操作或故障不應該對其有任何影響。

  這四個特性簡稱ACID。

(2).事務的實現

  創建實驗環境

mysql> create database test_db;
Query OK, 1 row affected (0.00 sec)

mysql> use test_db;
Database changed
mysql> create table user_tb(id int,name varchar(20));
Query OK, 0 rows affected (0.03 sec)

  事務相關命令

set autocommit = {0|1};  設置事務是否自動提交,0是禁止自動提交,1是開啟自動提交。默認是自動提交。
begin;    開始事務。
start transaction;    開始事務,與begin;的作用一樣。
savepoint [節點名稱];    設置一個節點,可以配合rollback使用。一個事務可以有多個節點。
rollback [to 節點名];    返回到指定節點,如果不指定節點則返回上一個節點,最多返回到開始節點。
commit;    提交當前事務

  在開始事務到提交事務或返回節點之間存在的SQL語句都是事務的一部分。但返回節點並不能結束事務。

  事務的使用實例

mysql> begin;  //開始一個事務
Query OK, 0 rows affected (0.00 sec)

mysql> insert into user_tb values(1,'張三');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user_tb;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
+------+--------+
1 row in set (0.00 sec)

mysql> savepoint point1;  //設置一個節點
Query OK, 0 rows affected (0.00 sec)

mysql> insert into user_tb values(2,'李四');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user_tb;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
|    2 | 李四   |
+------+--------+
2 rows in set (0.00 sec)

mysql> rollback to point1;  //回滾到節點point1
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_tb;  //可以看到數據回到節點point1時了
+------+--------+
| id   | name   |
+------+--------+
|    1 | 張三   |
+------+--------+
1 row in set (0.00 sec)

mysql> rollback;  //回滾到開始節點
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_tb;  //查看是沒有任何數據了
Empty set (0.00 sec)

mysql> rollback to point1;  //再次嘗試回滾到節點point1失敗,說明point1節點已經被刪除
ERROR 1305 (42000): SAVEPOINT point1 does not exist

mysql> insert into user_tb values(1,'王五');
Query OK, 1 row affected (0.00 sec)

mysql> select * from user_tb;
+------+--------+
| id   | name   |
+------+--------+
|    1 | 王五   |
+------+--------+
1 row in set (0.00 sec)

mysql> savepoint point1;
Query OK, 0 rows affected (0.00 sec)

mysql> insert into user_tb values(2,'趙六');
Query OK, 1 row affected (0.00 sec)

mysql> commit;  //提交當前事務
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_tb;  //可以看到節點對提交事務沒有任何影響
+------+--------+
| id   | name   |
+------+--------+
|    1 | 王五   |
|    2 | 趙六   |
+------+--------+
2 rows in set (0.00 sec)

mysql> rollback;  //嘗試在事務外回滾
Query OK, 0 rows affected (0.00 sec)

mysql> select * from user_tb;  //但實際並沒有任何作用
+------+--------+
| id   | name   |
+------+--------+
|    1 | 王五   |
|    2 | 趙六   |
+------+--------+
2 rows in set (0.00 sec)

  事務也可以一次寫完提交,但需要修改結束字符,需要使用delimiter [新的字符]

  注意:如果放回到設置的當前節點的上一個節點,那么當前節點就會被刪除。但是返回到當前節點后繼續向下操作,那么當前節點還可以使用。例如:一個事務存在開始節點、point1節點和point2節點,如果返回到了point1節點,那么point2節點就被刪除無法使用;但是返回到point2節點后,向下操作,下次還可以返回到point2節點。


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM