資料庫MySQL-事務

  • 2020 年 3 月 27 日
  • 筆記

1.5 事務

1.5.1 概述

事務(TRANSACTION)是一個整體,要麼一起執行,要麼一起不執行

1.5.2 事務特性

事務必須具備以下四個屬性,簡稱ACID 屬性:

原子性(Atomicity):事務是一個完整的操作。事務的各步操作是不可分的(原子的);要麼都執行,要麼都不執行

一致性(Consistency):當事務完成時,數據必須處於一致狀態

隔離性(Isolation):對數據進行修改的所有並發事務是彼此隔離的。

永久性(Durability):事務完成後,它對資料庫的修改被永久保持。

1.5.3 事務處理

開啟事務

start transaction  或 begin [work]

提交事務

commit

回滾事務

rollback

例題:

-- 插入測試數據  mysql> create table bank(      -> card char(4) primary key comment '卡號',      -> money decimal(10,2) not null      -> )engine=innodb charset=utf8;  Query OK, 0 rows affected (0.05 sec)    mysql> insert into bank values ('1001',1000),('1002',1);  Query OK, 2 rows affected (0.00 sec)  Records: 2  Duplicates: 0  Warnings: 0    -- 開啟事務  mysql> begin;  Query OK, 0 rows affected (0.00 sec)    mysql> delimiter //   -- 更改定界符  mysql> update bank set money=money-100 where card='1001';      -> update bank set money=money+100 where card='1002' //  Query OK, 1 row affected (0.04 sec)  Rows matched: 1  Changed: 1  Warnings: 0    -- 回滾事務  mysql> rollback //  Query OK, 0 rows affected (0.00 sec)    mysql> select * from bank  //  +------+---------+  | card | money   |  +------+---------+  | 1001 | 1000.00 |  | 1002 |    1.00 |  +------+---------+  2 rows in set (0.00 sec)    ------------------------------------------------------------------  -- 開啟事務  mysql> start transaction  //  Query OK, 0 rows affected (0.00 sec)    mysql> update bank set money=money-100 where card='1001';      -> update bank set money=money+100 where card='1002' //  Query OK, 1 row affected (0.00 sec)  Rows matched: 1  Changed: 1  Warnings: 0    -- 提交事務  mysql> commit //  Query OK, 0 rows affected (0.00 sec)    mysql> select * from bank //  +------+--------+  | card | money  |  +------+--------+  | 1001 | 900.00 |  | 1002 | 101.00 |  +------+--------+

設置事務的回滾點

-- 開啟事務  mysql> begin  //  Query OK, 0 rows affected (0.00 sec)    mysql> insert into bank values ('1003',500) //  Query OK, 1 row affected (0.00 sec)    -- 記錄事務的回滾點  mysql> savepoint a1  //  Query OK, 0 rows affected (0.00 sec)    mysql> insert into bank values ('1004',200) //  Query OK, 1 row affected (0.00 sec)    -- 回滾到回滾點  mysql> rollback  to a1  //  Query OK, 0 rows affected (0.00 sec)  -- 查詢  mysql> select * from bank //  +------+--------+  | card | money  |  +------+--------+  | 1001 | 900.00 |  | 1002 | 101.00 |  | 1003 | 500.00 |  +------+--------+  3 rows in set (0.00 sec)

自動提交事務

每一個SQL語句都是一個獨立的事務

小結:

1、事務是事務開啟的時候開始

2、提交事務、回滾事務後事務都結束

3、只有innodb支援事務

4、一個SQL語句就是一個獨立的事務,開啟事務是將多個SQL語句放到一個事務中執行