mysql事务
事务:
事务是由存储引擎提供的
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
我们执行一个事务时(4条sql语句),比如已经执行完3条了 ,但是在这是后服务器突然崩溃了,怎么办
一般情况下,我们将前边的3条撤销。
存储引擎是靠日志来完成类似的功能的。我们成为:
事务日志:
1、重做日志:我们的每一个操作,在写到数据库之前,先写到日志里边,就算后续 的操作崩溃了,我们还可以通过这个日志再执行一遍
2、撤销日志:
我们在每一次的操作之前,将原有的状态保存下来,如果我们想撤销 我们的操作的时候。可以恢复到某个状态
事务日志文件越小越好。如果我们的服务器崩溃了,因为服务器太大的话我们在启动的时候,会执行事务里边的内容。执行速度回很慢。启动会用比较长的时间。如果我们这时候ctrl+c
取消的话,数据会崩溃。
事务的处理
begin :开始一个事务
commit :提交一个事务
rollback :回滚一个事务
例子:
mysql> create table abc (name char(20),nianling int(3));
mysql> insert into abc values ('a',20);
然后我们开始一个事务
mysql> begin;
mysql> insert into abc values ('b',18);
mysql> insert into abc values ('c',22);
mysql> select * from abc;
+------+----------+
| name | nianling |
+------+----------+
| a | 20 |
| b | 18 |
| c | 22 |
+------+----------+
我们开始回滚事务
mysql> rellback;
mysql> select * from abc;
+------+----------+
| name | nianling |
+------+----------+
| a | 20 |
注意的是:要想回滚事务,不能提交事务,提交事务就不能回滚了。mysql默认是自动提交的。
我们提交事务
mysql> commit;
mysql为了提高mysql 的性能,一般mysqlI/O操作越少越好。事务每一次提交都会让硬盘做一次I/O操作。这样会造成大量的I/O操作。所以一般我们关闭自动提交
关闭自动提交
mysql> set autocommit=0;
mysql> select @@autocommit;
+--------------+
| @@autocommit |
+--------------+
| 0 |
+--------------+
然后我们在修改数据,不用输入begin就可以回滚了。
事务还支持 "保存点"
例子:我们有100条sql语句。执行到60条的时候,发现45条错了。我想回到45条。服务器默认一撤销会60条全撤销,这时候我们就用到了保存点。
例子:我们依然采用上边的表
用法:
savepoint 保存点名字 #注意点的名字不能以数字开头。
恢复:
rollback to 保存点的
mysql> create table abc (name char(20),nianling int(3));
mysql> begin;
mysql> savepoint s1; #第一个保存点
mysql> insert into abc values ('a',20);
mysql> savepoint s2; #第二个保存点
mysql> insert into abc values ('b',18);
mysql> savepoint s3;
mysql> insert into abc values ('c',22);
mysql> savepoint s4;
mysql> insert into abc values ('d',22);
mysql> savepoint s5;
按保存点还原
rollback to s4;
我们可以依次还原
如果从s5直接还原到s2 。那么在还原s3,s4都不可以。只能还原到s1了。因为s3,s4已经不存在了