MySQL的事务
什么是事务?
#### 主要针对DML语句(update delete insert)
一组数据操作执行步骤,这些步骤被视为一个工作单元:
1)用于对多个语句进行分组
2)可以在多个客户机并发访问同一个表中的数据时使用
所有步骤都成功或都失败
1)如果所有步骤正常,则执行
2)如果步骤出现错误或不完整,则取消
事务的特性
A:原子性,一个事务要么全部执行成功,要么失败就回滚
C:一致性,事务开启之前和事务执行结束后数据状态保持一致
I:隔离性,事务与事务之间是隔离的(锁,隔离级别)
D:持久性,事务操作完成要持久化
事务的生命周期
## 成功的事务
# 开启事务
begin/start transaction;
DML
DML
DML
DML
DML
...
# 提交事务
commit;
## 失败的事务
# 开启事务
begin;
DML
DML
DML
DML
DML
...
# 回滚事务
rollback;
事务流程的控制语句DTL( Database Transaction Language)
localhost:a >select * from a;
+------+
| id |
+------+
| 200 |
+------+
### 事务语句
#----- 开启一个事务 (start transation)
mysql 一号终端
start transaction / begin
#----查询mysql a.a 中的数据 (select)
mysql 一号终端:
select * from a.a;
+------+
| id |
+------+
| 200 |
+------+
mysql 二号终端:
select * from a.a;
+------+
| id |
+------+
| 200 |
+------+
#----修改200为600(update,select)
mysql 一号机:
update a set id=600;
select * from a; #---- 一号终端显示为 redo中的数据
+------+
| id |
+------+
| 600 |
+------+
mysql 二号机:
select * from a.a; #--- 二号终端 显示的是undo中的数据 还是200
+------+
| id |
+------+
| 200 |
+------+
update a.a set id=800; #--- 行级锁 等待一号终端的结束 有超时时间
卡住。。。。
#---- 保存修改 (commit select)
mysql 一号机
commit;
select * from a; #---- 一号终端显示为 redo中的数据
+------+
| id |
+------+
| 600 |
+------+
mysql 二号机
select * from a; #---- 一号终端显示为 redo中的数据
+------+
| id |
+------+
| 600 |
+------+
#--- 撤销事务 (rollback)
mysql一号机
rollback;
select * from a.a;
+------+
| id |
+------+
| 200 |
+------+
mysql二号机
select * from a.a;
+------+
| id |
+------+
| 200 |
+------+
mysql事务的标签(SAVEPOINT)
用来给 事务的进程打上标签 方便回滚。
sevepoint a
ROLLBACK TO SAVEPOINT a
#### 操作示范
begin; --------开启事务
select * from a; -----查询数据
+------+
| id |
+------+
| 600 |
+------+
update a set id=666; ------更新数据
select * from a; -------查询数据
+------+
| id |
+------+
| 666 |
+------+
savepoint id666; ------设置标签
update a set id=888; ------再次更新数据
select * from a;
+------+
| id |
+------+
| 888 |
+------+
update a set id=999; ------再次更新数据
localhost:a >rollback to savepoint id666; ------回滚数据
select * from a;
+------+
| id |
+------+
| 666 |
+------+
localhost:a >commit; ------提交事务
select * from a; ------查询结果
+------+
| id |
+------+
| 666 |
+------+
关于事务的自动提交
只要MySQL在执行一个DML语句后,会自动开启一个事务
# 1.在事务执行期间如果执行 DDL DCL语句都会导致事务自动提交 (create,grant)
# 2.在事务执行期间如果执行 begin 会自动提交上一个事务,开启一个新事务
# 3.在事务运行期间,执行锁定语句(lock tables、unlock tables)
# 4.load data infile
# 5.select for update
# 6.在autocommit=1的时候