数据库事务隔离性以及隔离性级别

版权声明: https://blog.csdn.net/qq_16525279/article/details/82424422

事务的概念

事务是访问并可能更新各种数据项的一个程序执行单元。

事务的特性(ACID 特性)

原子性(atomicity):事务的所有操作在数据库中要么全部反映出来,要么完全不反映。

一致性(consistency):隔离执行事务时(换言之,在没有其他事务并发执行的情况下)保持数据库的一致性。

隔离性(isolation):尽管多个事务可能并发执行,但系统保证,对于任何一对事务Ti和Tj,在Ti看来,Tj或者在Ti开始之前已经完成执行,或者在Ti完成之后开始执行。因此,每个事务都感觉不到系统中有其他事务在并发执行。

持久性(durability):一个事物成功完成后,它对数据库的改变必须是持久的,即使出现系统故障。

事务隔离性级别

SQL标准规定的隔离性级别

可串行化(serializable):通常保证可串行化调度。然而,一些数据库系统对该隔离性级别的实现在某些情况下允许非可串行化执行。最高隔离性级别。强制事务串行执行。可避免脏读、不可重复读、幻读的发生。

可重复读(repeatable read):只允许读取已提交数据,而且在一个事务两次读取一个数据项期间,其他事务不得更新该数据。但该事务不要求与其他事务可串行化。例如:当一个事务在查找满足某些条件的数据时,它可能找到一个已提交事务插入的一些数据,但可能找不到该事务插入的其他数据。保证在同一个事务中多次读取同样数据的结果是一样的。可避免脏读、不可重复读的发生。

已提交读(read committed):只允许读取已提交数据,但不要求可重复读。比如,在事务两次读取一个数据项期间,另一个事务更新了该数据并提交。一个事务只能读取已经提交的事务所做的修改。换句话说,一个事物所做的修改在提交之前对其他事务是不可见的。可避免脏读的发生。

未提交读(read uncommitted):允许读取未提交数据。这是SQL允许的最低一致性级别。事务中的修改,即使没有提交,对其他事务也是可见的。最低级别,任何情况都无法保证。

以上所有隔离性级别都不允许脏写(dirty write),即如果一个数据项已经被另外一个尚未提交或中止的事务写入,则不允许对该数据项执行写操作。

许多数据库系统运行时的默认隔离性级别是已提交读。在SQL中,除了接受系统的默认设置,还可以显式地设置隔离性级别。例如,语句“set transaction isolation level serializable;”将隔离性级别设置为可串行化,其他隔离性级别可类似设定。

修改隔离性级别必须作为事务的第一条语句执行。此外,如果单条语句的自动提交默认打开,则必须关闭。

猜你喜欢

转载自blog.csdn.net/qq_16525279/article/details/82424422