数据库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语句放到一个事务中执行