1.基本概念
事务是数据库执行的基本单元,一般包含了多个数据库语句操作,但是这些操作要么全都执行,要么全都不执行,是一种不可分割的工作单位。
2.事务的ACID特性
1)原子性(Atomicity)
指的是以事务为单元 要么全都执行 要么全都不执行。
如何实现:事务有自己定义的工作范围,在事务开始和事务结束范围内发生任何操作异常,事务都会实现回滚操作,将已执行的操作撤回,从而保证了数据库操作要么都执行,要么都不执行。
2)一致性(Consistency)
指的是在一个事务执行之前和执行之后数据库都必须处于一致性状态。
2.1)数据库完整性:数据库主键,约束等保持不变
2.2)逻辑一致性:A给B转账100元,那么A账户减少100元,B账户同时增加100元。
3)持久性(Durability)
指的是事务一旦提交成功,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。
如何实现:事务对数据库做的操作,优先于数据库写入了操作日志中,即使断电后重启数据库,会首先查找未执行的操作日志,继续完成对数据库的操作,从而保证了事务成功执行。
4)隔离性(Isolation)
指的是在并发环境中,当不同的事务同时操纵相同的数据时,事务与事务之间相互独立,互不干扰。
注:数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。3
3.事务的不同隔离级别
1)未提交读:允许事务读取其他事务未提交的数据,会出现“脏读”现象。
场景: 步骤1:事务A更新了字段a,还未提交;
步骤2:事务B读取字段a,读取到了事务A未提交的数据。
步骤3:事务A有回滚之前的更新操作,这就导致事务B读取的数据是不正确的。
2)已提交读:允许事务读取其他事务已提交的数据。解决了“脏读”问题,但是存在“不可重复读”问题(一个事务先后读取同一条记录,但两次读取的数据不同,我们称之为不可重复读)
场景:步骤1:事务B读取了字段a;
步骤2:事务A更新了字段a并提交成功;
步骤3:事务B再次读取字段a,此时发现前后两次读取的数据不一样了,无法判断到底哪个是正确的。
3)可重复读:确保事务可以多次从同一个字段中获取相同的值,即事务期间,禁止其他事务对该字段进行更新操作。解决了“不可重复读”问题,但是存在“幻读”问题(一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据,这种现象就称为幻读)
场景:步骤1:事务B读取所有工作人员人数;
步骤2:事务A(人事)新来了一名员工,向数据库中插入一条员工记录;
步骤3:事务B再次读取所有工作人员人数,此时发现前后两次读取的员工数不一样了,即出现“幻读”。
4)串行读:串行按事务顺序读取,读取使用表级共享锁,读写相互都会阻塞。隔离级别最高。(以上3个均为行锁/记录锁,当前为表锁)