天天看點

mysql事務

1、什麼是事務?

   事務是作為一個不可分割的邏輯單元而被執行的一組sql語句,要麼同時執行成功要麼撤銷。

2、事務的四個特性?(ACID)

1、原子性:構成一個事務的所有語句應該是一個獨立的邏輯單元,要麼全部執行成功,要麼一個都不成功。你不能隻執行它們當中的一部分。

2、穩定性(一緻性):  資料庫在事務開始執行之前和事務執行完畢之後都必須是穩定的。換句話說,事務不應該把你的資料庫弄得一團糟。

3、隔離性(孤立性):  事務不應該互相影響。

4、可靠性(持久性): 如果事務執行成功,它的影響将被永久性地記錄到資料裡。

3、使用事務的前提條件是什麼呢?表的存儲引擎必須是innodb

4、使用事務

我們先來建立一個銀行的轉賬表,字段為使用者id、使用者名、錢,這裡注意下我們使用的是innodb的存儲引擎。

CREATE TABLE `brank`.`bank` (

`userid` INT NOT NULL AUTO_INCREMENT ,

`name` VARCHAR( 20 ) NOT NULL ,

`money` INT NOT NULL ,

PRIMARY KEY ( `userid` ) 

) ENGINE = InnoDB;

然後插入兩條測試資料:

INSERT INTO `brank`.`bank` (

`userid` ,

`name` ,

`money` 

)

VALUES (

NULL , '張三', '1000'

), (

NULL , '李四', '1'

);

檢視結果:

+--------+------+-------+

| userid | name | money |

|      1 | 張三 |  1000 |

|      2 | 李四 |     1 |

2 rows in set (0.00 sec)

現在我們來實作這個轉賬的過程,根據上面的分析我們知道這需要兩條sql語句來實作。假設我們要實作張三轉800元給李四?

  第一:我們要修改張三的記錄将money字段的值減去800

  第二:我們要修改李四的記錄将 money字段的值增加800

在預設的情況下,mysql從自動送出模式運作,這種模式會在每條語句執行完畢後把它作出的修改立刻送出給資料庫并使之永久化。事實上,這相當于把每一條語句都隐含地當做一個事務來執行。如果你想明确地執行事務,需要禁用自動送出模式并告訴mysql你想讓它在何時送出或復原有關的修改。

執行事務的常用辦法是發出一條start transaction或begin語句挂起自動送出模式,然後執行構成本次事務的各條語句,最後用一條commit語句結束事務并把它們作出的修改永久性的記入資料庫。萬一在事務過程中發生錯誤,用一條rollback語句撤銷事務并把資料庫恢複到事務開始之前的狀态。

1) 現在我們來開始事務:

Mysql>Begin;

      Query OK, 0 rows affected (0.00 sec)

執行第一條修改句

Mysql>update bank set money = money -800 where name = ‘張三’;

Query OK, 1 row affected (0.05 sec)

Rows matched: 1  Changed: 1  Warnings: 0

執行第二條修改語句

Mysql>update bank et money = money + 800 where name = ‘李四’;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that

corresponds to your MySQL server version for the right syntax to use near 'money

 = money + 800 where name = '李四'' at line 1

這個時候語句出錯了,想想我們應該怎麼辦?那我們就讓事務復原一下

2) 事務復原:

Mysql > rollback;

Query OK, 0 rows affected (0.05 sec)

Mysql > select * from bank;

看到效時了吧,和執行事務之前的資料狀态一樣。這就是使用事務的好處

3) 自動送出模式(mysql預設的送出模式)

Set autocommit = 1; 

非自動送出模式

Set autocommit = 0;

      本文轉自噼裡啪啦啦 51CTO部落格,原文連結:http://blog.51cto.com/pilipala/1670693,如需轉載請自行聯系原作者