事务
- 一个数据库事务可以包含多个查询、修改、删除、插入等数据库动作,它们要么作为一个整体完全得到确认,要么完全失败(原子性)
- 事务提交(commit)之后就不能回滚了
- 一个事务只能包含对一个数据库实例的数据操作,不允许跨多个数据库实例,跨多个数据库实例需要分布式事务支持
- 数据库事务会给数据库带来并发操作带来一定影响,会降低系统的并发能力
特性
数据库事务的四大特性(简称ACID):
原子性
不可分割的操作单元,事务中的所有操作,要么全部完成,要么全部不完成;不可能停滞在中间某个环节。
- 事务在执行过程中若发生错误,会被回滚(rollback)到事务开始前的状态。
一致性
在事务开始之前和结束之后,数据库的完整性约束没有被破坏。
或:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的。
- 进行数据库提交操作时使用事务(Transaction)是为了保证数据一致性
隔离性
事务操作之间彼此独立和透明,互不影响;事务独立运行;通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。
持久性
事务一旦提交,其结果就是永久的;即使发生系统故障,也能恢复。
或:在事务完成后,该事务对数据库所作的更改便持久地保存在数据库中,并不会被回滚。
- 持久性通过数据库备份和恢复来保证
隔离级别
- Read Uncommitted(未提交读)
- Read Committed(提交读)
- Repeatable Read(可重复读)
- Serializable(可串行化)
- 隔离级别依次增加
- 并发性能依次降低
- 随着隔离级别的增高,并发性能降低
Read Uncommitted
可以读取其他事务修改但未提交的数据
- 会导致“脏读”、“幻读”和“不可重复读取”
Read Committed
只能读取其他事务修改并已经提交的数据
- 避免了“脏读”
- 不能避免“幻读”、“不可重复读取”
- 提交读是大多数主流数据库的默认事务等级
Repeatable Read
锁定已经读取的数据,当前事务提前其他事务不允许修改。
- 避免了“脏读”、“不可重复读取”
- 不能避免“幻读”
- 带来了更多的性能损失
Serializable
读取前锁定所有要读取的数据,当前事务提交前,其他事务不允许修改
- 最严格的级别
- 事务串行执行,资源消耗最大