事务
事务特性
原子性 Atomicity
一个事务中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节,而且事务在执行过程中发生错误,会被回滚到事务开始前的状态,就像这个事务从来没有执行过一样。
一致性 Consistency
是指事务操作前和操作后,数据满足完整性约束,数据库保持一致性状态。
隔离性 Isolation
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致,因为多个事务同时使用相同的数据时,不会相互干扰,每个事务都有一个完整的数据空间,对其他并发事务是隔离的。
持久性 Durability
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
并发事务的问题
脏读
如果一个事务读到了另一个未提交事务修改过的数据,就意味着发生了脏读。
因为事务A还没提交事务,所以随时可能发生rollback,这样B读到的数据就是过期的数据,这种现象被称为脏读。
不可重复读
在一个事务中多次读取同一个数据,如果前后两次得到的结果不一样,就意味着发生了不可重复读现象。
A事务的持续时间比B长,B提交事务后A又读到了数据,前后结果不一致。
幻读
在一个事务内多次查询某个符合条件的记录数量,如果出现前后两次查询到的记录数量不一致的情况,就意味着发生了幻读现象。
事务的隔离级别
- 读未提交 read uncommitted 一个事务未提交时,它做的变更就能被其他事务看到;
- 读提交 read committed 一个事务提交之后,他做的变更才能被其他事务看到;
- 可重复读 repeatable 一个事务执行过程中看到的数据,一直跟这个事务启动时看到的数据是一致的;
- 串行化 serializable 会对记录加上读写锁,在多个事务对这条记录进行读写操作时,如果发生了读写冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。
针对不同的隔离级别,并发事务时可能发生的现象也会不同。
并发控制
Transaction State
- Active 初始状态;事务执行的时候处于这个状态
- Partially committed 最终状态执行后
- Failed 发生异常之后
- Aborted 回滚,数据库将该状态存储在事务的开始。抛出异常后可以选择重启事务或者停止事务
- Committed 成功结束后
- Terminated 要么提交要么抛出异常
两阶段锁协议
本博客所有文章除特别声明外,均采用 CC BY-NC-SA 4.0 许可协议。转载请注明来自 Napleon!
评论