1.事务原理
一个事务会涉及到大量的cup计算和IO操作,这些操作被打包成一个执行单元,要么同时都完成,要么同时都不完成。
1.1自动提交原理图
如果没有显式启动事务,数据库会根据autocommit的值.默认
1.2手动提交原理图
如果开启了事务,其中有任何一条语句因为崩溃或者其他原因无法执行,那么该组所有的SQL语句都不会执行。
1.3事务提交步骤
客户端连接上服务器端,创建链接同时创建当前用户的临时事务日志文件。
开启事务,改变原有的操作机制(所有的操作都会先写入临时日志文件)。
写入SQL,接受并执行SQL,所有的SQL操作都会写入临时文件;返回数据时,从数据库表拿取数据,但要通过临时日志文件加工在返回。
事务提交或回滚,提交:同步临时文件中的SQL操作结果刀数据库表;回滚:清除临时日志文件
2.事务回滚
我们可以在mysql事务处理过程中定义保存点(SAVEPOINT)然后回滚到指定的保存点前的状态。定义保存点,以及回滚到指定保存点前的状态的语法如下:
格式:
savepoint 保存点名; #定义保存点
rollback to savepoint 保存点名; #回滚到指定保存点
或
rollback to 保存点名;
2.1数据表准备
#创建⼀个管理员表
create table manager(
id int primary key auto_increment,
uname varchar(20),
pword varchar(20)
);
#插⼊数据
insert into manager(uname,pword)
values('zhangsan','zhangsan'),('lisi','lisi');
#插⼊数据
insert into manager(uname,pword)
values('wangwu','wangwu'),
('zhaoliu','zhaoliu');
2.3案例
开启事务
向表中插入二条件记录
设置保存点,保存点的名字为:insert_point
向表中插入二条件记录
回到保存点:insert_point
mysql> start transaction;
Query OK, 0 rows affected (0.01 秒)
mysql> insert into manager(uname,pword)
values('zhangsan','zhangsan'),('lisi','lisi');
Query OK, 2 rows affected (0.01 秒)
mysql> select * from manager;
+----+----------+----------+
| id | uname | pword |
+----+----------+----------+
| 1 | zhangsan | zhangsan |
| 2 | lisi | lisi |
+----+----------+----------+
2 ⾏于数据集 (0.01 秒)
mysql> savepoint insert_point;
Query OK, 0 rows affected (0.01 秒)
mysql> insert into manager(uname,pword)
values('wangwu','wangwu'),
('zhaoliu','zhaoliu');
Query OK, 2 rows affected (0.01 秒)
mysql> select * from manager;
+----+----------+----------+
| id | uname | pword |
+----+----------+----------+
| 1 | zhangsan | zhangsan |
| 2 | lisi | lisi |
| 3 | wangwu | wangwu |
| 4 | zhaoliu | zhaoliu |
+----+----------+----------+
4 ⾏于数据集 (0.01 秒)
mysql> rollback to savepoint insert_point;
Query OK, 0 rows affected (0.00 秒)
mysql> select * from manager;
+----+----------+----------+
| id | uname | pword |
+----+----------+----------+
| 1 | zhangsan | zhangsan |
| 2 | lisi | lisi |
+----+----------+----------+
2 ⾏于数据集 (0.01 秒)
注意:
设置保存点可以让我们在失败的时候回到保存点,而不是回到事务开启的时候。