0%

SQL | 事务

Transaction

事务

  • 一个数据库事务可以包含多个查询、修改、删除、插入等数据库动作,它们要么作为一个整体完全得到确认,要么完全失败(原子性)
  • 事务提交(commit)之后就不能回滚了
  • 一个事务只能包含对一个数据库实例的数据操作,不允许跨多个数据库实例,跨多个数据库实例需要分布式事务支持
  • 数据库事务会给数据库带来并发操作带来一定影响,会降低系统的并发能力

特性

数据库事务的四大特性(简称ACID):

  1. 原子性(Atomicity)
  2. 一致性(Consistency)
  3. 隔离性(Isolation)
  4. 持久性(Durability)

原子性

不可分割的操作单元,事务中的所有操作,要么全部完成,要么全部不完成;不可能停滞在中间某个环节。

  • 事务在执行过程中若发生错误,会被回滚(rollback)到事务开始前的状态。

一致性

在事务开始之前和结束之后,数据库的完整性约束没有被破坏。
或:如果在执行事务之前数据库是一致的,那么在执行事务之后数据库也还是一致的。

  • 进行数据库提交操作时使用事务(Transaction)是为了保证数据一致性

隔离性

事务操作之间彼此独立和透明,互不影响;事务独立运行;通常使用锁来实现。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。

持久性

事务一旦提交,其结果就是永久的;即使发生系统故障,也能恢复。
或:在事务完成后,该事务对数据库所作的更改便持久地保存在数据库中,并不会被回滚。

  • 持久性通过数据库备份和恢复来保证

隔离级别

  1. Read Uncommitted(未提交读)
  2. Read Committed(提交读)
  3. Repeatable Read(可重复读)
  4. Serializable(可串行化)
  • 隔离级别依次增加
  • 并发性能依次降低
  • 随着隔离级别的增高,并发性能降低

Read Uncommitted

可以读取其他事务修改但未提交的数据

  • 会导致“脏读”、“幻读”和“不可重复读取”

Read Committed

只能读取其他事务修改并已经提交的数据

  • 避免了“脏读”
  • 不能避免“幻读”、“不可重复读取”
  • 提交读是大多数主流数据库的默认事务等级

Repeatable Read

锁定已经读取的数据,当前事务提前其他事务不允许修改。

  • 避免了“脏读”、“不可重复读取”
  • 不能避免“幻读”
  • 带来了更多的性能损失

Serializable

读取前锁定所有要读取的数据,当前事务提交前,其他事务不允许修改

  • 最严格的级别
  • 事务串行执行,资源消耗最大

参考资料

Thank you for your approval.

欢迎关注我的其它发布渠道