数据库事务与其隔离级别

来源:互联网 发布:aft3登陆器源码 编辑:程序博客网 时间:2024/05/29 14:23

什么是数据库事务

数据库事务就是一系列的数据库操作。我对事务的理解就是事务是一系列要做的操作,并按照特定的顺序完成。例如:1.换上运动装。2.打篮球。3.洗澡。这三个操作便可以组成一个事务,并且顺序是确定的。这三个操作要么全都做,要么都不做,不能出现如:只换上了运动装,打了篮球,而没有洗澡这样的情况。通过把一组相关的操作组成事务,可以使错误恢复更方便,并且能提高应用程序的可靠性。

数据库事务的属性(ACID)

原子性(Atomicity)

我们提到数据库事务是一系列数据库操作的序列,而这一系列操作应当被视为一个整体。即这一系列操作要么全都执行,要么全都不执行,不能只执行一部分。这便是数据库事务的原子性。

一致性(Consistency)

事务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。关系型数据库中,所有的规则必须应用到事务的修改上,以便维护所有数据的完整性。

隔离性(Isolation)

由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不能查看中间状态的数据。这时事务将获得最高的隔离级别(可序列化)。

持久性(Durability)

事务完成之后,它对于系统的影响是永久性的。即使出现致命的系统故障这个修改也将一直保持。

事务的隔离级别

在对数据库进行并发访问的时候,如多个事务并发执行时,如果没有相应的机制对数据的并发访问进行控制,就会导致错误。比如事务A对数据进行了修改但还未提交修改,这是事务B读取了事务A修改过的数据,结果事务A进行了回滚,最终事务B读取到的数据就是不真实的,这就称为脏读。下面就从低到高介绍一下数据库事务的四种隔离级别,通过数据库隔离级别的设置对事务并发进行控制,从而减少错误的发生。

未提交读

最低级别的隔离,即一个事务可以访问另一个事务修改但未提交的数据。会引发丢失数据修改脏读不可重复读幻象等问题。

已提交读

事务只能读取其他写事务提交修改后的数据,避免了脏读的问题。但是这个事务在读取数据时,其他事务仍可以对数据进行修改并提交,所以就会导致多次读取统一数据的结果不一致,即不可重复读。很多数据库默认的就是这个级别。

可重复读

在这个隔离级别下,一个事务在读取数据时,其他事务不能对数据进行修改,因此就保证了同一事务多次读取数据的结果一致。但是这个隔离级别仍然不能保证不发生幻象问题。MySQL数据库默认为该级别。

可串行化

该级别是最高的隔离级别,从名字便可以看出,事务并发执行的结果和串行执行的结果一致。这个级别可以保证不出现幻象问题。

总结

数据库通过设置事务隔离级别对事务并发进行控制,可以减少并发问题。但是隔离级别应该按照需求来设置,不能一味的认为最高的隔离级别就是最好的。事务隔离是通过锁来实现的,事务隔离级别越高,则并发程度就越低。高级别的事务隔离会降低执行效率,因此应当根据需要来选择合适的隔离级别。

0 0
原创粉丝点击