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就可以回滚了。

 

事务还支持  "保存点"

例子:我们有100sql语句。执行到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已经不存在了

原文地址:https://www.cnblogs.com/pangbing/p/6535031.html