一.什么是事务
事务是应用程序中一系列严密的操作,所有操作必须成功完成,否则在每个操作中所作的所有更改都会被撤消。也就是事务具有原子性,一个事务中的一系列的操作要么全部成功,要么一个都不做。
事务的结束有两种,当事务中的所以步骤全部成功执行时,事务提交。如果其中一个步骤失败,将发生回滚操作,撤消撤消之前到事务开始时的所以操作。
二.事务的 ACID
事务具有四个特征:原子性( Atomicity )、一致性( Consistency )、隔离性( Isolation )和持续性( Durability )。这四个特性简称为 ACID 特性。
1 、原子性
事务是数据库的逻辑工作单位,事务中包含的各操作要么都做,要么都不做
2 、一致性
事 务执行的结果必须是使数据库从一个一致性状态变到另一个一致性状态。因此当数据库只包含成功事务提交的结果时,就说数据库处于一致性状态。如果数据库系统 运行中发生故障,有些事务尚未完成就被迫中断,这些未完成事务对数据库所做的修改有一部分已写入物理数据库,这时数据库就处于一种不正确的状态,或者说是 不一致的状态。
3 、隔离性
一个事务的执行不能其它事务干扰。即一个事务内部的操作及使用的数据对其它并发事务是隔离的,并发执行的各个事务之间不能互相干扰。
4 、持续性
也称永久性,指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。接下来的其它操作或故障不应该对其执行结果有任何影响。
以上就是ACID的概念,如果面试最好举个详细的例子,最好也是最常见的例子就是银行转账!
数据库系统必须维护事务的以下特性 ( 简称 ACID) :
原子性 (Atomicity)
一致性 (Consistency)
隔离性 (Isolation)
持久性 (Durability)
原子性 (Atomicity)
事务中的所有操作要么全部执行,要么都不执行;
如果事务没有原子性的保证,那么在发生系统
故障的情况下,数据库就有可能处于不一致状态。
原子性 (Atomicity)
如果故障发生在 write(A) 和 read(B) 之间,则将有可能造成帐户 A 的余额已经减去 50 元钱,而帐户 B 的余额却没有改变,凭空就少了 50 元钱。值得注意的是,即使没有故障发生,系统在某一时刻也会处于不一致状态。原子性的要求就是这种不一致状态除了在事务执行当中出现外,在其他任何时刻都是不可见的。保证原子性是 DBMS 的责任:即事务管理器和恢复管理器的责任。
一致性 (Consistency)
主要强调的是,如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一
致的;所谓一致性简单地说就是数据库中数据的完整性,包括它们的正确性。对于图中的事务 Ti 来说,一致性要求就是事务的执行不改变帐户 A 和帐户 B 的和。否则的话事务就会创造或销毁钱!单个事务的一致性是由对该事务进行编键的应用程序员的责任,但是在某些情况下利用 DBMS 中完整性约束 ( 如触发器 ) 的自动检查功能有助于一致性的维护。
隔离性 (Isolation)
即使多个事务并发(同时)执行,每个事务都感觉不到系统中有其他的事务在执行,因而也
就能保证数据库的一致性;事情的起因 : 即使每个事务都能保持一致性和原子性,但如果几个事务并发执行,且访问相同的数据项,则它们的操作会以人们所不希望的某种方式交叉执行,结果导致不一致的状态!访问相同数据项的两个事务并发执行
解决办法 :
如果几个事务要访问相同的数据项,为了保证数据库的一致性,可以让这几个事务:
① 串行执行:即一个接着一个地执行事务;
② 并发执行:即同时执行多个事务,但用并发控制机制来解决不同事务间的相互影响。隔离性的保证 :
事务的隔离性能够确保事务并发执行后的系统状态与这些事务按某种次序串行执行后的状态是等价的。
保证隔离性也是 DBMS 的责任:即并发控制管理器的责任。
持久性 (Durability)
事务成功执行后它对数据库的修改是永久的,即使系统出现故障也不受影响。
持久性的含义是说:一旦事务成功执行之后,它对数据库的更新是永久的。可以用以下两种方式中的任何一种来达到持久性的目的:
以牺牲应用系统的性能为代价
以多占用磁盘空间为代价
以牺牲应用系统的性能为代价:要求事务对数据库系统所做的更新在事务结束前已经写入磁盘;以多占用磁盘空间为代价:要求事务已经执行的和已写到磁盘的、对数据库进行更新的信息是充分的(例如,数据库日志的信息就足够的多),使得 DBMS 在系统出现故障后重新启动系统时,能够 ( 根据日志 ) 重新构造更新。保证持久性也是 DBMS 的责任:即恢复管理器的责任。
事物的状态有如下几种:
⑴ 中止事务:执行中发生故障、不能执行完成的事务;
⑵ 事务回滚:将中止事务对数据库的更新撤消掉;
⑶ 已提交事务:成功执行完成的事务。
3系统的恢复步骤是:
1 、反向扫描文件日志(即从最后向前扫描日志文件),查找该事务
的更新操作。
2 、对该事务的更新操作执行逆操作。即将日志记录 “ 更新前的值 ” 写
入数据库。这样,如果记录中是插入操作,则相当于做删除操
作;若记录中是删除操作,则做插入操作;若是修改操作,则相
当于用修改前的值代替修改后的值。
3 、继续反向扫描日志文件,查找该事务的其他更新操作,并做和 2
一样的同样处理。
4 、如此处理下去,直至读到此事务的开始标记,事务的故障恢复就
完成了。
事务的隔离级别
隔离级别定义了事务与事务之间的隔离程度。
隔离级别与并发性是互为矛盾的:隔离程度越高,数据库的并发性越差;隔离程度越低,数据库的并发性越好。
ANSI/ISO SQL92 标准定义了一些数据库操作的隔离级别
未提交读( read uncommitted )
提交读( read committed )(oracle默认隔离级别)
重复读( repeatable read )(MySQL的默认隔离级别)
串行读( serializable )
隔离级别的效果更新丢失( lost update ):当系统允许两个事务同时更新同一数据是,发生更新丢失。脏读( dirty read ):当一个事务读取另一个事务尚未提交的修改时,产生脏读。
不可重复读取( nonrepeatableread ):同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读取。
幻像( phantom read ):同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻像读。