0%

数据库事务

一、数据库事务的4个特性(ACID)

  • 原子性(Atomic)
    表示组成一个事务的多个数据库操作是一个不可分割的原子单元,只有所有的操作执行成功,整个事务才提交。事务中的任务一个数据库操作失败,已经执行的任何操作都必须撤销,让数据库返回到初始状态。

  • 一致性(Consistency)
    事务操作成功后,数据所处的状态和它的业务规则是一致的,即数据不会被破坏。如从A账户转账100元到B账户,不管操作成功与否,A账户和B账户的存款总额是不变的。

  • 隔离性(Isolation)
    在并发数据操作时,不同的事务拥有各自的数据空间,它们的操作不会对对方产生干扰。准备说,并非要求做到完全无干扰。数据库规定了多种事务隔离级别,不同的隔离级别对应不同的干扰程序,隔离级别越高,数据一致性越好,但并发性越弱。

  • 持久性(Durabiliy)
    一旦事务提交成功后,事务中所有的数据操作都必须被持久化到数据库中。即使在提交事务后,数据库马上崩溃,在数据库重启时,也必须保证能够通过某种机制恢复数据。

二、事务的并发问题

  • 脏读
    A事务读取了B事务尚未提交的更改数据,B事务可能发生回滚,这时A事务读到的数据根本不存在,发生了脏读。

  • 不可重复读
    A事务读取了B事务已经提交的更改数据。

  • 幻象读
    A事务读取B事务提交的新增数据,这时A事务将出现幻象读。 幻象读一般发生在计算统计数据的事务中。

  • 第一类丢失更新
    A事务撤销时,把已经提交的B事务的更新数据覆盖了。

  • 第二类丢失更新
    A事务覆盖B事务已经提交的数据,造成B事务所做操作丢失。

注:幻象读和不可重复读是两个容易混淆的概念,前者是指读到了其他已经提交事务的新增数据,而后者是指读到了已经提交事务的更改数据(更改或删除)。为了避免这两种情况,采取的对策是不同的:防止读到更改数据,只需对操作的数据添加行级锁,阻止操作中的数据发生变化;而防止读到新增数据,则往往需要添加表级锁,即将整张表锁定,防止新增数据。

三、数据库锁机制

  数据并发会引发很多问题,在一些场合下有些问题是允许的,但在另一些场合下可能是致命的。数据库通过锁机制解决并发访问的问题。按锁定的对象不同,一般可以分为表锁定行锁定。前者对整张表进行锁定,后者对表中的特定行进行锁定。从并发事务锁定的关系上看,可以分为共享锁定独占锁定。共享锁定会防止独占锁定,但允许其他的共享锁定;而独占锁定既防止其他的独占锁定,也防止其他的共享锁定。

四、事务隔离级别

  尽管数据库为用户提供了锁的DML操作方式,但直接使用锁管理是非常麻烦的,因为数据库为用户提供了自动锁机制。只要用户指定会话的事务隔离级别,数据库就会分析事务中的SQL语句,然后自动为事务操作的数据资源添加适合的锁。此外,数据库还会维护这些锁,当一个资源上的锁数目太多时,自动进行锁升级以提高系统的运行性能,这对用户来说是透明的。

  ANSI/ISO SQL92标准定义了4个等级的事务隔离级别,在相同的数据环境下,使用相同的输入,执行相同的工作,根据不同的隔离级别,可能导致不同的结果。不同事务隔离级别能够解决的数据并发问题的能力是不同的。

隔离级别 脏读 不可重复读 幻象读 第一类丢失更新 第二类丢失更新
READ UNCOMMITED 1 1 1 0 1
READ COMITED 0 1 1 0 1
REPEATABLE READ 0 0 1 0 0
SERIALIZABLE 0 0 0 0 0
-------------本文结束感谢您的阅读-------------

本文标题:数据库事务

文章作者:

发布时间:2020年11月18日 - 21:11

最后更新:2021年08月22日 - 17:08

原始链接:http://www.liyyao.com/202011182114.html

许可协议: 署名-非商业性使用-禁止演绎 4.0 国际 转载请保留原文链接及作者。