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