事务
由一系列数据库操作组成的一个完整的逻辑过程,的是满足ACID特性的一组操作,可以通过Commit提交一个事务,也可以使用Rollback进行回滚
- 原子性(Atomicity): 事务中所有操作要么全部成功,要么全部失败
- 一致性(Consistency): 事务从一种一致的状态到另一种一致的状态,不会破坏系统的完整性
- 隔离性(Isolation): 并发事务之间相互影响的程度
- 持久性(Durability): 事务所有成功的操作对系统的影响是永久存在的
并发一致性问题
- 脏读: 事务A读取事务B修改后的记录, 之后事务B失败rollback之后事务A读到了错误的数据
- 不可重复读: 事务A读取某条数据之后事务B成功修改了该记录,A再次读取同条记录前后读取不一致
- 幻影读: 事务A根据某种检索条件读取了若干条记录,事务B插入一条记录,A再次相同检索条件读取了若干条记录前后不一致
锁类型
- 共享锁(读锁, S锁): 事务对数据加共享锁, 事务对数据只可以读取不可以更新, 其他事务只可以加共享锁, 不可以加互斥锁
- 互斥锁(写锁, X锁): 事务对数据加互斥锁, 事务对数据可以读取也可以更新, 其他事务不可以加共享锁, 也不可以加互斥锁
- 可以按照锁的粒度把数据库锁分为行级锁(INNODB引擎),表级锁(MYISAM引擎),页级锁(BDB引擎 )。
隔离级别
- 未提交读(Uncommit Read): 事务读取时对数据未加锁, 更新时对数据加行级共享锁(我觉得这句话有问题, 因为共享锁是无法修改数据的),
- 提交读(Commit Read): 事务读取时对数据加行级共享锁, 一旦读取完就释放掉, 更新时对数据加行级排它锁, 直到事务结束, 可以避免脏读
- 可重复读(Repeatable Read): 事务读取时对数据加行级共享锁, 直到事务结束, 更新时对数据加行级排它锁, 直到事务结束, 可以避免可重复读
MVCC(多版本并发控制)
在每条记录后面添加两个字段记录添加的创建时间(创建版本号)和删除时间(删除版本号), 读取记录的时候读取创建时间小于当前, 删除时间大于当前