数据库事务的特性(ACID)

数据库事务的特性

【原子性 Atomicity】【一致性 Consistency】

【隔离性 Isolation】【持久性 Durability】

详解

事务(transcation)是数据库应用中完成单一逻辑功能【也叫逻辑单元】的操作集合。

事务的目的:将数据库从一个一致的状态转入新的一个一致的状态。

在我的理解里,事务的各种特性都是为了保障和达到这一目的。

1.原子性 Atomicity

事务的原子性即是操作集合的不可再分性,将其看为一个整体,就像生活中的事一样,要么做,要么不做,不能做一半停止,这也是为了规避这种操作给数据库带来不一致性。比如银行卡【转账】这个事务,假使从A卡转到B卡,那么操作序列应该是,从A卡中取出转账的金额,再将其存入B卡中。如果失去原子性的要求,将事务操作集合拆分,那么就有可能出现这样的事,将A卡的金额取出,不执行存入B卡的操作,那么现在数据库相当于丢失了取出的金额,这是一件非常可怕的事,想想你存到银行的钱突然间莫名其妙不见了,你一定会把银行拆了的。

2.一致性 Consistency

这里可以引入能量守恒定理,就容易理解了,数据库存储的数据【这里指关系型数据库】有其内部关系,逻辑联系,事务的目的只是转化数据库的状态,而不该改变其内部逻辑,否则就违反了事务本身的出发点。因此一致性就是指在事务开始之前和事务结束以后数据库的完整性约束没有被破坏。这是说数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性

还是刚才的例子,存到银行卡的钱,不管它怎么转账,都应该还是那么多钱,即使取现,那其实逻辑还是一样的,取了花了仅仅说明你是转到别的地方去了,不是转到B卡里而已。

3. 隔离性 Isolation

多个事务并发访问数据库时,各事务之间是相互隔离互不干扰的,一个事务不应该影响其它事务运行效果。

当多个事务对同一个数据进行操作时,各个事务都拥有自己完整的数据空间。由于事务是相互隔离的,因此当前事务所读取到的数据,一定要么是另一事务操作前的数据,要么是事务操作后的数据,是不会读取到中间状态的数据的。事务最复杂问题都是由事务隔离性引起的。完全的隔离性是不现实的,完全的隔离性要求数据库同一时间只执行一条事务,这样会严重影响性能。

这里又会涉及到事务的隔离级别的知识点了

事务的隔离级别有下面几种:

可串行化(Serializable):可避免脏读、不可重复读、幻读的发生。当我们将当前会话的隔离级别设置为serializable的时候,其他会话对该表的写操作将被挂起。可以看到,这是隔离级别中最严格的,但是这样做势必对性能造成影响。

可重复读 (Repeatable read):可避免脏读、不可重复读的发生。当我们将当前会话的隔离级别设置为repeatable read的时候,当前会话可以重复读,就是每次读取的结果集都相同,而不管其他事务有没有提交。

可提交读 (Read committed):可避免脏读的发生。当我们将当前会话的隔离级别设置为read committed的时候,当前会话只能读取到其他事务提交的数据,未提交的数据读不到。

未提交读 (Read uncommitted):最低级别,任何情况都无法保证。我们将事务隔离级别设置为read uncommitted,即便是事务没有commit,但是我们仍然能读到未提交的数据,这是所有隔离级别中最低的一种。

【补充】知识点

脏读:指一个事务正在访问数据,并对这个数据进行了修改,但此修改还未提交到数据库,此时另一个事务也访问了这个数据,并读取了修改之后的数据,这时这个事务就发生了脏读,

不可重复读:指在一个事务内,多次读取同一个数据,但在此事务还未结束时,另一个事务也访问了这个数据,那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样在一个事务内两次读到的数据是不一样的,因此称为是不可重复读。【不可重复读的关键点在于修改update】

幻读:是指事务不是独立执行所发生的一种现象。例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象发生了幻觉一样。【幻读的关键点在于添加add】

4.持久性

持久性,意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库之中,并不会被回滚。(完成的事务是系统永久的部分,对系统的影响是永久性的,该修改即使出现致命的系统故障也将一直保持)。

对数据库的操作是有效的,且不因系统故障等情况改变。

你可能感兴趣的:(数据库事务的特性(ACID))