数据库事务处理

1、简介

       数据库事务( transaction)是访问并可能操作各种数据项的一个数据库操作序列,这些操作要么全部执行,要么全部不执行,是一个不可分割的工作单位。事务由事务开始与事务结束之间执行的全部数据库操作组成。

       数据库事务是一个逻辑上的划分,有的时候并不是很明显,它可以是一个操作步骤也可以是多个操作步骤。我们可以这样理解数据库事物:对数据库所做的一系列修改,在修改过程中,暂时不写入数据库,而是缓存起来,用户在自己的终端可以预览变化,直到全部修改完成,并经过检查确认无误后,一次性提交并写入数据库,在提交之前,必要的话所做的修改都可以取消。提交之后,就不能撤销,提交成功后其他用户才可以通过查询浏览数据的变化。

       经典案例:银行转账,第一步骤从第一个账户划出款项,第二步骤将款项存入第二个账户。在这个过程中,两个环节是关联的。第一个账户划出款项必须保证正确的存入第二个账户,如果第二个环节没有完成,整个的过程都应该取消,否则就会发生丢失款项的问题。整个交易过程,可以看作是一个事物,成功则全部成功,失败则需要全部撤消,这样可以避免当操作的中间环节出现问题时,产生数据不一致的问题。

 

2、性质(ACID)

  • 原子性(Atomicity):事务中的全部操作在数据库中是不可分割的,要么全部完成,要么全部不执行。
  • 一致性(Consistency):几个并行执行的事务,其执行结果必须与按某一顺序 串行执行的结果相一致。
  • 隔离性(Isolation):事务的执行不受其他事务的干扰,事务执行的中间结果对其他事务必须是透明的。
  • 持久性(Durability):对于任意已提交事务,系统必须保证该事务对数据库的改变不被丢失,即使数据库出现故障。

       事务的ACID特性是由关系数据库系统(DBMS)来实现的,DBMS采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所作的更新,如果某个事务在执行过程中发生错误,就可以根据日志撤销事务对数据库已做的更新,使得数据库同滚到执行事务前的初始状态。

       对于事务的隔离性,DBMS是采用锁机制来实现的。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

 

3、作用

  • 为数据库操作序列提供了一个从失败中恢复到正常状态的方法,同时提供了数据库即使在异常状态下仍能保持一致性的方法。
  • 当多个应用程序在并发访问数据库时,可以在这些应用程序之间提供一个隔离方法,以防止彼此的操作互相干扰。

 

4、数据库事务处理相关命令

进行的操作

命令

查看存储引擎

SHOW CREATE TABLE 表名;

更改引擎

ALTER TABLE 表名 ENGINE=新引擎名;

回滚

ROLLBACK;

声明事务开始

BEIGIN;

事务提交

COMMIT;

查询自动提交功能状态

SELECT @@AUTOCOMMIT;

设置自动提交功能

SET AUTOCOMMIT=0或1;

设置分离水平

SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

 

5、存储引擎

       MySQL数据库的存储引擎是可以选择改变和替换的(可替换存储引擎构架,Pluggable Storage Engine Architecture)。MySQL主要有8种存储引擎:

存储引擎

特征

MyISAM

高速引擎,不支持事务处理

InnoDB

支持行锁定以及事务处理,速度比MyISAM稍慢

ISAM

MyISAM的前身

MERGE

将多个MyISAM类型的表作为一个表来处理的引擎

MEMORY,HEAP

只在内存上保存数据

Falcon

一种新的存储引擎,支持事务处理

ARCHIVE

将数据压缩后保存(只能支持INSERT/SELECT操作

CSV

以CSV形式保存数据(应用于跨平台数据交换)

 

6、事务处理

       之前讲到,事务处理是一毁全毁,因此事务中任意一个任务或指令失败,整个事务都将失败。那是怎么实现的呢?方法是时间中多个任务全部成功,则任务成功结束,并且会进行提交(COMMIT),如果任何一件任务失败,则强制回滚(ROLLBACK)到初始状态。

       事务处理涉及到三个最重要的命令:BEGIN,ROLLBACK,COMMIT,分别表示声明事务开始,回滚,确认提交

(1)回滚

事务在BEGIN之后但还没COMMIT的时候可以用ROLLBACK回滚到BEGIN之前的数据,而如果COMMIT提交之后则不能用ROLLBACK回滚到原来的数据。

(2)自动提交

当搜索引擎为MyISAM时,因为不支持事务处理,因此命令一旦执行,就一定会提交,这种默认的提交方式被称为自动提交。

       而当搜索引擎设置为InnoDB时,可以设置自动提交功能是否开启,当自动提交功能为ON时,命令执行就会提交(COMMIT),而自动提交设置为OFF 时,必须执行COMMIT才提交,可以使用ROLLBACK进行回滚。

查询当前自动提交功能状态:

SELECT @@AUTOCOMMIT;

设置自动提交功能:

SET AUTOCOMMIT=0或1;

(3)部分回滚

       直接ROLLBACK会回滚到BEGIN开始之前的地方,而通过SAVEPOINT可以保存一个点,通过ROLLBACK TO SAVEPOINT就可以回滚到保存点了,也就实现了“想去哪就去了哪”。

部分回滚主要有两个步骤:

①保存点

SAVEPOINT 保存点名;

②回滚到保存点

ROLLBACK TO SAVEPOINT 保存点名;

(4)不能事务处理的命令(直接提交)

       大部分命令都可以通过事务处理(BEGIN -ROLLBACK- COMMIT)进行操作,但是:

  • DROP DATABASE;
  • DROP TABLE;
  • DROP;
  • ALTER TABLE

不能通过事务处理,会直接COMMIT;

 

7、锁定与事务处理

(1)锁定

(a)锁定的分类

       锁定分为共享锁定(Shared Lock)和排他锁定(Exclusive Lock):

  • 共享锁定是将对象数据变为只读形式,不能进行更新,所以也称为读取锁定;
  • 排他锁定是当执行INSERT/UPDATE/DELETE的时候,其它事务不能读取该数据,因此也称为写入锁定。

(b)锁定的粒度

       锁定对象的大小是锁定的粒度,有三种粒度:

  • 记录
  • 数据库

(2)事务处理的分离水平

       需要使用锁定来有效解决事务冲突的情况,但是锁定也会使性能下降(因为别人无法访问),因此频繁锁定不一定合理,数据库中,使用分离水平来表示事务处理之间的影响程度。

       事务处理的分离水平对应的数据整合情况:

分离水平

非提交读取

不可重复读取

幻象读取

READ UNCOMMITED

READ COMMITED

×

REPEATABLE READ

×

×

SERIALIZABLE

×

×

×

设置分离水平可以使用命令:

SET SESSION TRANSACTION ISOLATION LEVEL 分离水平;

(a)非提交读取

       非提交读取指的是别的事务能够读取到还没有提交的更新数据,只发生在分离水平为READ UNCOMMITED的情况下。

       因为对事务处理的读取没有任何限制,所以一般不推荐使用。

(b)不可重复读取

       不可重复读取是指在某事务处理过程中对数据进行读取,由于该事务更新操作导致多次读取数据时发生了改变。

       不可重复读取发生在READ COMMITED 一下的分离水平。

(c)幻象读取

       幻象读取指的是,在某事物处理数据过程中对数据多次读取,由于该事务的插入/删除操作而导致在多次读取过程中读取到不存在或者消失的数据。

       当设置分离水平为SERIALIZABLE时,可以消除幻象读取。

(3)死锁 Dead Lock

       死锁指的是两个事务互相对待对方释放锁定,则永远也不可能接触锁定的状态。

 

参考:https://blog.csdn.net/moxigandashu/article/details/62046030

 

猜你喜欢

转载自blog.csdn.net/King_weng/article/details/106507133