【MySQL】事物定义及其特征(ACID)

本文介绍了数据库事务,它是访问并可能更新数据库数据项的程序执行单元,用于维护数据库完整性。事务具有原子性、一致性、隔离性、持续性的ACID特性。还阐述了事务并发可能出现的脏读、不可重复读、虚读问题,以及数据库定义的四种隔离级别。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务(Transaction)是访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。事务通常由高级数据库操纵语言或编程语言(如SQL,C++或Java)书写的用户程序的执行所引起,并用形如begin transaction和end transaction语句(或函数调用)来界定。事务由事务开始(begin transaction)和事务结束(end transaction)之间执行的全体操作组成。

简单地说,事务是一种机制,用以维护数据库的完整性。

例如:在关系数据库中,一个事务可以是一条SQL语句,一组SQL语句或整个程序。

事务是恢复和并发控制的基本单位。

事务应该具有4个属性:原子性、一致性、隔离性、持续性。这四个属性通常称为ACID特性。

(也有种说法:正确的说法应该是:ACID是对数据库进行操作(对数据库有更改)时应该具有的四个特性,事务(transaction)是满足ACID的一系列操作,ACID是对数据库进行操作时的要求,事务是数据库的操作逻辑单元,它满足了ACID,在不同的数据库中,事务的具体实现是不同的,但是都能保证满足ACID。)

 

原子性(atomicity)。一个事务是一个不可分割的工作单位,事务中包括的诸操作要么都做,要么都不做。

一致性(consistency)。事务必须是使数据库从一个一致性状态变到另一个一致性状态。一致性与原子性是密切相关的。

隔离性(isolation)。一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

持久性(durability)。持续性也称永久性(permanence),指一个事务一旦提交,它对数据库中数据的改变就应该是永久性的。接下来的其他操作或故障不应该对其有任何影响。


☆关于事物并发可能出现的三个主要异常问题:
  脏读 指一个事务读取了另一个事务未提交的数据。这是非常危险的,假设 a 向 b 转账 100 元,a 在一台电脑上开启事务执行如下 2 步操作,向B存入100元,并把自己的钱减少100元:

   update account set money=money+100 while name='b';

  1. update account set money=money-100 while name='a';

当第1步执行完,第2步还未执行,a 未提交时,此时 b 查询自己的帐户就会发现自己多了100元钱,以为 a 转了100元。如果 a 等 b 走后再回滚,b 就会损失100元。 

不可重复读:在一个事务内读取表中的某一行数据,多次读取结果不同。例如银行想查询A帐户余额,第一次查询A帐户为200元,此时A(另一事务)向帐户内存了100元,此时A帐户为300元了,银行可能就会很困惑,不知道哪次查询是准的。和脏读的区别是,脏读是读未提交,不可重复读是读已提交。 
虚读:是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,这种修改涉及到表中的全部数据行。 同时,第二个事务也修改这个表中的数据,这种修改是向表中插入一行新数据。那么,以后就会发生操作第一个事务的用户发现表中还有没有修改的数据行,就好象 发生了幻觉一样。 


☆事务的隔离级别 
  多个线程开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个线程在获取数据时的准确性。
☆数据库共定义了四种隔离级别 
  Read uncommitted(读未提交):最低级别,以上情况均无法保证。 
  Read committed(读提交):可避免脏读情况发生。 
  Repeatable read(可重复读):可避免脏读、不可重复读情况的发生。 
  Serializable(串行化):可避免脏读、不可重复读、虚读情况的发生。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值