1、什么是事务?
1.1 为什么需要数据库事务
转账是生活中常见的操作,比如从A账户转账100元到B账号。站在用户角度而言,这是一个逻辑上的单一操作,然而在数据库系统中,至少会分成两个步骤来完成:
1.将A账户的金额减少100元
2.将B账户的金额增加100元。
在这个过程中可能会出现以下问题:
1.转账操作的第一步执行成功,A账户上的钱减少了100元,但是第二步执行失败或者未执行便发生系统崩溃,导致B账户并没有相应增加100元。
2.转账操作刚完成就发生系统崩溃,系统重启恢复时丢失了崩溃前的转账记录。
3.同时又另一个用户转账给B账户,由于同时对B账户进行操作,导致B账户金额出现异常。
为了便于解决这些问题,需要引入数据库事务的概念。
1.2 什么是数据库事务
定义:数据库事务是构成单一逻辑工作单元的操作集合
一个典型的数据库事务如下所示
BEGIN TRANSACTION //事务开始
SQL1
SQL2
COMMIT/ROLLBACK //事务提交或回滚
关于事务的定义有几点需要解释下:
1.数据库事务可以包含一个或多个数据库操作,但这些操作构成一个逻辑上的整体。
2.构成逻辑整体的这些数据库操作,要么全部执行成功,要么全部不执行。
3.构成事务的所有操作,要么全都对数据库产生影响,要么全都不产生影响,即不管事务是否执行成功,数据库总能保持一致性状态。
4.以上即使在数据库出现故障以及并发事务存在的情况下依然成立。
1.3 事务如何解决问题
对于上面的转账例子,可以将转账相关的所有操作包含在一个事务中
BEGIN TRANSACTION
A账户减少100元
B账户增加100元
COMMIT
1.当数据库操作失败或者系统出现崩溃,系统能够以事务为边界进行恢复,不会出现A账户金额减少而B账户未增加的情况。
2.当有多个用户同时操作数据库时,数据库能够以事务为单位进行并发控制,使多个用户对B账户的转账操作相互隔离。
事务使系统能够更方便的进行故障恢复以及并发控制,从而保证数据库状态的一致性。
1.4 事务的ACID特性以及实现原理概述
原子性(Atomicity):事务中的所有操作作为一个整体像原子一样不可分割,要么全部成功,要么全部失败。
一致性(Consistency):事务的执行结果必须使数据库从一个一致性状态到另一个一致性状态。一致性状态是指:1.系统的状态满足数据的完整性约束(主码,参照完整性,check约束等) 2.系统的状态反应数据库本应描述的现实世界的真实状态,比如转账前后两个账户的金额总和应该保持不变。
隔离性(Isolation):并发执行的事务不会相互影响,其对数据库的影响和它们串行执行时一样。比如多个用户同时往一个账户转账,最后账户的结果应该和他们按先后次序转账的结果一样。
持久性(Durability):事务一旦提交,其对数据库的更新就是持久的。任何事务或系统故障都不会导致数据丢失。
在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面
1.事务的并发执行
2.事务故障或系统故障
数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。
并发控制技术保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。
日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。
2、并发异常与并发控制技术
2.1 常见的并发异常
在讲解并发控制技术前,先简单介绍下数据库常见的并发异常。
1.脏写
脏写是指事务回滚了其他事务对数据项的已提交修改,比如下面这种情况
在事务1对数据A的回滚,导致事务2对A的