三大关系型数据库事务详解之一:基本概念

1、基本概念数据库

  假设用户A要从他的帐户里面给B转帐1000元,那么就须要两步来实现,首先从A的帐号减去1000元,再给B帐号加1000元。这两个步骤中,任何一步都不能少或者出错,这两步要么都获得成功操做完成,要么什么都不作,中途出错也要回滚到转帐开始以前的状态。这样的一个过程就是咱们常常说的事务。根据这个例子,下来咱们就给事务定义以下:并发

  事务transaction)是为了保证数据的一致性和完整性,由一系列数据操做或指令组成的一个不可分割的逻辑单元,这些操做或指令要么全都获得执行,要么全都不执行。若是事务成功执行,则该事务中对全部数据所作的更改均会成为数据库中持久性更改;若是事务执行过程当中遇到错误,则全部执行的操做和更改均应获得取消,回滚到事务执行前的状态。从定义看,事务应该知足四个属性,即ACID,也就是原子性、一致性、隔离性、持久性。spa

  • 原子性(Atomicity,或称不可分割性):事务中的全部操做,要么所有都成功执行,要么所有都没有执行完成。这种不可中断的一系列操做就是原子性。转帐过程当中,A帐号减去1000元和B帐号加1000元,必须都获得执行,或者都不执行,不然都不符合逻辑和实际状况。日志

  • 一致性(Consistency):事务开始以前和事务完成之后,全部相关的数据状态都会保持一致,不会使数据库的完整性获得破坏。原子性会确保数据保持一致性,转帐过程产生中断,第一步执行了,第二步没有执行,这个时候,只是A帐号少了1000元,而B帐号没有加1000元,这个时候,数据就不一致了。事务

  • 隔离性(Isolation,又称独立性):数据库中多个并发事务同时执行时,一个事务的执行不能受到其余事务的干扰,也就是说,一个事务内的操做和使用的数据对其余事务是隔离的,不会受到其余并发的事务影响。例如:事务查看数据所处的状态,要么是另外一个并发事务的修改以前的状态,要么就是另外一个事务修改以后的状态,不会是中间状态的数据。内存

  • 持久性(Durability):事务执行完后,对数据的修改就是永久的,即使系统出现故障,不会产生回滚,也不会影响到执行结果。ci

2、事务的运行模式it

一般,事务以3种模式运行,他们分别是:自动提交事务、显式事务和隐式事务。io

1. 自动提交事务table

每一条单独的SQL语句都在其执行完成后进行自动提交事务,即执行 SQL 语句后就会立刻自动隐式执行 COMMIT 操做。若是出现错误,则进行事务回滚至以前状态。

2. 显式事务

经过指定事务开始语句来显式开启事务来做为开始,并由以提交命令或者回滚命令来提交或者回滚事务做为结束的一段代码就是一个用户定义的显式事务。

3. 隐式事务

在隐式事务中,无需使用BEGIN TRANASACTION 来开启事务,每一个SQL语句第一次执行就会开启一个事务,直到用COMMIT [TRANSACTION]来提交或者ROLLBACK [TRANSACTION]来回滚结束事务。

在ORACLE、MYSQL和SQL SERVER中,这几种模式的开启和关闭方式都有着本身不一样的命令,具体命令请参见《关系型数据库事务详解之三:事务运行模式》

3、事务的运行状态

事务在执行过程当中有着不一样的状态:

1. 活动状态

事务初始和执行时所处于的状态。

2. 部分提交状态

事务执行完最后一条语句,直到操做实际输出所有从内存写入到磁盘这一过程,处于部分提交状态。

3. 提交状态

事务对数据的更改所有写入磁盘,并写入相关事务日志。事务就进入提交状态。

4.失败状态

事务未正常执行完,事务就进入失败状态。这种状态的事务必须回滚。

5. 终止状态

事务进行了回滚,而且数据库已经恢复到事务执行前的状态。这个时候处于终止状态。

4、事务的并发控制

数据库容许多个事务能够同时并发执行。当多个事务同时执行操做同一个数据,会形成如下并发问题:脏读、不可重复读和幻读。

1. 脏读 是指一个事务读取到了另外一个事务还没有提交的数据。

2. 不可重复读 是指受到其余事务更改数据的影响,一个事务屡次读到的同一个数据的值不一致。

3.幻读 是指由于受到其余事务插入或者删除操做的影响,一个事务读到的两次的数据记录数目不同。

数据库经过设置隔离级别来应对这几种问题。事务的隔离级别分别4种,按级别从低到高依次是Read uncommitted 、Read committed 、Repeatable read 、Serializable 。

Read Uncommited 就是一个事务在其余事务尚未提交更改时,能够读取数据。这种级别,以上三种并发问题都会出现。

Read Committed 就是一个事务要等其余事务提交后才能读取数据。在这种隔离级别下有可能发生不可重复读和幻读。

Repeatable Read 就是在一个事务开始读取数据时,再也不容许其余事务有修改数据的操做。这种级别就不会发生不可重复读,只有可能出现幻读。

serializable 就是全部的事务都是串行执行的,一个事务执行完了,再接着执行其它的事务。这样能够解决以上说有并发问题,可是由于经过大量的加锁来实现的,因此效率很低。

相关文章
相关标签/搜索