[置顶] 《MySQL必知必会学习笔记》:事务处理

事务处理

并不是所有的引擎都支持事务处理,常见的引擎有:InnoDB和MyISAM。InnoDB支持事务处理,而MyISAM不支持。这里我们可以回顾一下:MyISAM是支持全文本搜索的,而InnoDB是不支持全文不搜索的。因此,在选择引擎的时候,我们首先明白,我们准备干什么,如果我们需要进行全文本搜索,则我们就选择MyISAM引擎。如果我们需要进行事务处理,则我们就选择InnoDB引擎。这点我们需要牢记。

哪什么是事务处理呢??

事务处理是用来维护数据库的完整性的,它保证成批的MySQL操作要么完全执行,要么完成不执行。

举一个例子来进行说明,例如:你去银行取钱,你取钱和银行卡上扣钱必须要满足要么这两者全部执行,要么都不执行,你总不能你在银行取了200块钱,而银行卡上的的钱还是原来的那么多,是吧?虽然你可能希望这个事情发生。如果你希望这件事发生,但是也有可能是你银行卡上的钱扣了,但是,自动取款机出现故障,没有吐钱,这样你是不是比较郁闷。

事务处理在各种管理系统中都有着广泛的应用,比如人员管理系统,很多同步数据库操作大都需要用到事务处理。

比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

 删除的SQL语句
delete from userinfo where ~~~
delete from mail where ~~
delete from article where~~
~~

如果没有事务处理,在你删除的过程中,假设出错了,只执行了第一句,那么其后果是难以想象的!
但用事务处理。如果删除出错,你只要rollback就可以取消删除操作(其实是只要你没有commit你就没有确实的执行该删除操作)

因此,像这样类似的一系列操作,要么全部正确执行,要么全部不执行。事务处理就是来做这个事情的。

事务

事务是DBMS的执行单位。它由有限个数据库操作语句组成。但不是任意的数据库操作序列都能成为事务。一般来说,事务是必须满足4个条件(ACID)

  • 原子性(Autmic):事务在执行性,要做到“要么不做,要么全做!”,就是说不允许事务部分得执行。即使因为故障而使事务不能完成,在rollback时也要消除对数据库得影响!
  • 一致性(Consistency):事务得操作应该使使数据库从一个一致状态转变倒另一个一致得状态!就拿网上购物来说吧,你只有即让商品出库,又让商品进入顾客得购物篮才能构成事务!
  • 隔离性(Isolation):如果多个事务并发执行,应象各个事务独立执行一样!
  • 持久性(Durability):一个成功执行得事务对数据库得作用是持久得,即使数据库应故障出错,也应该能够恢复!

在使用事务和事务处理,涉及到以下一个术语,这里解释一下:

1、事务(transaction) 指一组SQL语句。

2、回退(rollback) 指撤销指定的SQL语句的过程。

3、提交(commit) 指将未存储的SQL语句结果写入到数据库中。

4、保留点(savepoint) 指事务处理过程中设置的临时占位符,你可以对它发布回退(与回退整个事务处理不同)。

控制事务处理

管理事务处理的关键在于将SQL语句组分解为逻辑块,并明确规定数据何时应该回退,何时不应该回退。

MySQL使用如下的语句来标识事务的开始:

start tracsaction;

使用rollback命令进行回退MySQL语句,看如下的例子:

start transaction;//事务开始
delete from ticket;//删除表中的数据
select * from ticket;//查看表中的数据,此时表中应该没有数据
rollback;//回退,即取消上面所有的操作。
select * from ticket;//查询表中的数据,此时表中应该有数据

操作如下:

在实际操作中看到的结果和我们的预期是一样的哈。

rollback只能在一个事务处理内使用(即在执行一条start transaction命令之后);

到底哪些语句可以回退,哪些不可以呢???

在MySQL中,insert、update、delete这些操作是可以回退的,而像create、drop是不可以回退的,即使你执行了回退,它们也不会被撤销。

下面再来看commit

一般的MySQL数据都是直接针对数据库表执行和编写的。这就是所谓的隐含提交,即提交(写或保存)操作是自动进行的,不需要我们人为的提交。

但是,在事务处理块中,提交不会隐含的进行。为进行明确的提交,需要使用commit语句。

看一个例子:

上面的例子就是先删除火车标号为768的信息,再添加了火车标号为766的余票数据,最后进行了提交。如果事务中的两个中只要有一个没有执行成功,则即使你使用了commit进行提交,它们中的操作也是不会被提交的,实际上,它们是被自动撤销的。

当我们使用了commit或rollback语句,执行后,事务会自动关闭。将来在我们没有启用事务(start transaction)时的所有语句都会改为默认的隐含提交。

下面再看使用保留点

保留点与我们打游戏闯关备份,这个东西一致,当我们在打游戏的过程中,打到了第10关,我们就可以备份下,这样我们下次玩这个游戏的时候,就可以直接从这里开始。

保留点也与我们的代码备份类似,就是不停的备份,当我们想找某一个版本时,我们直接拿出那个版本的代码即可。

保留点也是这个道理,当一个事务比较大的时候,我们就可以在不同的地方设置很多保留点,这样,我们就不用直接使用rollback回到起点重新来过。而是rollback savepoint_name继续操作。

简单的rollback和commit语句就是撤销或回退整个事务处理。

为了支持回退部分事务处理,必须能在事务处理块中合适的位置放置占位符,这样,如果需要回退,可以回退到某个占位符即可。

这些占位符称为保留点。创建占位符,使用savepoint命令:

savepoint  point_name;//设置占位符,占位符的名字为point_name;

回退到占位符:

rollback to point_name;

注意:保留点越多越好,这样,你回退时选择的位置就越多。

关于释放保留点:保留点在事务处理完成后会自动释放,不需要我们认为操作。当然,如果你想自己释放,也可以,使用release point_name即可完成。

最后,看一个保留点的例子

例子如下:
在ticket表中先删除trainID=868的数据,设置一个保留点,然后插入一行数据,发现在插入数据插错了,这个时候我们的保留点就可以排上用场了,即rollback到保留点,而不是直接rollback到起点位置。
[置顶] 《MySQL必知必会学习笔记》:事务处理_第1张图片

更改默认的提交行为

前面已经说过,只有事务不是自动提交,需要我们通过commit来进行写入数据库进行更改。一般的MySQL行为是自动提交所有的更改,如果你想不自动进行提交更改,可以使用如下的命令来进行修改:

set autocommit=0;

autocommit标志决定是否自动提交更改,不管有没有commit语句。将autocommit设置为0指示MySQL不自动提交更改,设置autocommit为1就表示自动提交更改。

参考资料

书籍:《MySQL必知必会》
blog:http://www.cnblogs.com/in-loading/archive/2012/02/21/2361702.html

你可能感兴趣的:(mysql,事务,commit,rollback,Transactio)