事务
-
概述
- 事务(TRANSACTION)是一个整体,要么一起执行,要么一起不执行
-
事务特性:事务必须具备以下四个属性,简称ACID 属性
- 原子性(Atomicity)
- 事务是一个完整的操作
- 事务的各步操作是不可分的(原子的)
- 要么都执行,要么都不执行
- 一致性(Consistency)
- 当事务完成时,数据必须处于一致状态
- 隔离性(Isolation)
- 对数据进行修改的所有并发事务是彼此隔离的
- 永久性(Durability)
- 事务完成后,它对数据库的修改被永久保持
- 原子性(Atomicity)
更改定界符 delimiter
-
一般情况下的定界符
- 其实就是告诉mysql解释器,该段命令是否已经结束了,mysql是否可以执行了
- 默认情况下,delimiter是分号;
- 在命令行客户端中,如果有一行命令以分号结束,那么回车后,mysql将会执行该命令
-
可能输入较多的语句,且语句中包含有分号时的定界符设置
- 默认情况下,不可能等到用户把这些语句全部输入完之后,再执行整段语句
- 因为mysql一遇到分号,它就要自动执行
- 这种情况下,就需要事先把delimiter换成其它符号,如//或$$
MariaDB [sel]> create table bank(
-> card char(4) primary key comment '卡号',
-> money decimal(10,2) not null
-> )charset=utf8;
# `Query OK, 0 rows affected (0.023 sec)`
MariaDB [sel]> insert into bank values ('1001',1000),('1002',10);
# `Query OK, 2 rows affected (0.012 sec)`
# `Records: 2 Duplicates: 0 Warnings: 0`
MariaDB [sel]> begin;
# `Query OK, 0 rows affected (0.000 sec)`
MariaDB [sel]> delimiter //
MariaDB [sel]> update bank set money=money-100 where card='1001';
-> update bank set money=money+90 where card='1002'//
# `Query OK, 1 row affected (0.008 sec)`
# `Rows matched: 1 Changed: 1 Warnings: 0`
Query OK, 1 row affected (0.008 sec)
# `Rows matched: 1 Changed: 1 Warnings: 0`
MariaDB [sel]> rollback //
# `Query OK, 0 rows affected (0.008 sec)`
MariaDB [sel]> select * from bank //
+------+---------+
| card | money |
+------+---------+
| 1001 | 1000.00 |
| 1002 | 10.00 |
+------+---------+
# `2 rows in set (0.000 sec)`
事务处理
-
相关指令
- 开启事务
start transaction
或begin [work]
- 提交事务
commit
- 回滚事件
rollback
- 记录事务的回滚点
savepoint 锚点
- 开启事务
-
自动提交事务
- 每一个SQL语句都是一个独立的事务
-
事务生命周期
- 事务是事务开启的时候开始
- 提交事务、回滚事务后事务都结束
- 只有innodb支持事务
- 一个SQL语句就是一个独立的事务,开启事务是将多个SQL语句放到一个事务中执行
事务处理提交
MariaDB [sel]> start transaction //
# `Query OK, 0 rows affected (0.000 sec)`
MariaDB [sel]> update bank set money=money-100 where card='1001';
-> update bank set money=money+90 where card='1002'//
# `Query OK, 1 row affected (0.007 sec)`
# `Rows matched: 1 Changed: 1 Warnings: 0`
# `Query OK, 1 row affected (0.008 sec)`
# `Rows matched: 1 Changed: 1 Warnings: 0`
MariaDB [sel]> commit //
# `Query OK, 0 rows affected (0.008 sec)`
MariaDB [sel]> select * from bank //
+------+--------+
| card | money |
+------+--------+
| 1001 | 900.00 |
| 1002 | 100.00 |
+------+--------+
# `2 rows in set (0.000 sec)`
事务处理回滚
MariaDB [sel]> begin //
# `Query OK, 0 rows affected (0.000 sec)`
MariaDB [sel]> insert into bank values ('1003',500) //
# `Query OK, 1 row affected (0.007 sec)`
MariaDB [sel]> savepoint a1 //
# `Query OK, 0 rows affected (0.000 sec)`
MariaDB [sel]> insert into bank values ('1004',500) //
# `Query OK, 1 row affected (0.000 sec)`
MariaDB [sel]> rollback to a1 //
# `Query OK, 0 rows affected (0.000 sec)`
MariaDB [sel]> select * from bank //
+------+--------+
| card | money |
+------+--------+
| 1001 | 900.00 |
| 1002 | 100.00 |
| 1003 | 500.00 |
+------+--------+
# `3 rows in set (0.000 sec)`