高性能MySQL——事务

1、事务的ACID特性

ACID,是指在数据库管理系统DBMS)中事务所具有的四个特性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

在数据库系统中,一个事务是指由一系列数据库操作组成的一个完整的逻辑过程。例如银行转帐,从原账户扣除金额,以及向目标账户添加金额,这两个数据库操作的总和构成一个完整的逻辑过程,不可拆分。这个过程被称为一个事务,具有ACID特性。

原子性:

整个事务中的所有操作,要么全部完成,要么全部不完成,不可能停滞在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

比如说,一个事务开始更新100行记录,但是在更新了20行之后(因为某种原因)失败了,那么此时数据库会回滚(撤销)对那20条记录的修改。

一致性:

在事务开始之前和事务结束以后,数据库的完整性约束没有被破坏。

事务将数据库从一个一致性状态带入另一个一致性状态。 比如说,在一个银行事务(在描述关系数据库事务的特性时,基本上都是用银行事务来作为描述对象的)中,需要从存储账户扣除款项,然后在支付账户中增加款项。 如果在这个中转的过程发生了失败,那么绝对不能让数据库只执行其中一个账户的操作,因为这样会导致数据处于不一致的状态(这样的话,银行的账目上,借贷就不平衡了)。

如果数据库系统运行中发生故障,有些事物尚未完成就被迫中断了,系统就将此事务中对数据库的所有已经完成的操作全部撤销,滚回到事务开始时的一致状态。

隔离性:

两个事务的执行是互不干扰的,一个事务不可能看到其他事务运行时,中间某一时刻的数据。

这个特性是说,直到事务结束时(commit/rollback),其他事务(或者会话)对此事务所操作的数据都不可见(但并不是说其他会话的读取会被阻塞)。 比如说,一个用户正在修改hr.employees表,但是没有提交,那么其他用户在这个修改没有提交之前是看不到这个修改的。

持久性:

在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。

指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

被提交的更改会永久地保存到数据库中(并不是说以后就不可以修改)。 事务提交之后,数据库必须通过“恢复机制”来确保事务更改的数据不会丢失。

 

事务ACID特性可能遭到破坏的因素有:

  • 多个事务并行运行时,不同事物的操作交叉运行;
  • 事务在运行过程中被强行停止。

 

事务的状态有如下几种:

  • 中止事务:执行中发生故障,不能执行完成的事务;
  • 事务回滚:将中止事务对数据库的更新撤销掉;
  • 已提交事务:成功执行完成的事务。

2、事务的隔离级别

  • READ UNCOMMITTED(未提交读)——事务中的修改即使没有提交,对其他事务也是可见的;
  • READ COMMITTED(提交读)——一个事务开始时,只能看见已经提交的事务所做的修改(多数数据库的默认事务隔离级别);
  • REPEATABLE READ(可重复读)——该级别保证在同一事务中,多次读取同样记录的结果是一直的(可重复读是MySQL的默认事务隔离级别);
  • SERIALIZABLE(可串行化)——强制事务的串行执行,避免了幻读的问题。

3、死锁

死锁是指两个或多个事务在统一资源上相互占用,并请求锁定对方占用的资源,从而导致恶性循环的现象。死锁发生后,只有部分或者完全回滚其中一个事务,才能打破死锁。

posted @ 2017-11-06 21:14  西门吹-牛  阅读(312)  评论(0编辑  收藏  举报