什么是事务
数据库事务(Database Transaction) ,是指作为单个逻辑工作单元执行的一系列读或写操作。其目的是提供三种方法:失败恢复到正常状态的方法、保持一致性的方法、并发操作之间保持隔离的方法,通俗的说是那一系列操作要么完全地执行,要么完全地不执行。
事务的ACID特性
- A:原子性(Actomicity),该系列操作作为一个整体,不能被分割,要么全执行,要么都不执行;
- C:一致性(Consistency),确保数据从一种状态变为另一种状态;
- I:隔离性(Isolation),多个事务并发执行时,彼此之间互不影响;
- D:持久性(Durability),当事务提交成功后,对数据的修改要永久保存在数据库中。
并发异常类型
- 回滚丢失: 由于一个事务的失败回滚导致另一个事务的更新丢失了;
- 覆盖丢失: 更新被其他事务给覆盖了;
- 脏读: 一个事务读取了另一个事务修改未提交的数据;
- 不可重复读: 一个事务对同一行数据执行了两次或更多次查询,但是却得到了不同的结果;
- 幻读: 与不可重复读相似,不过针对的是数据的数量,当一个事务查询记录两次或多次时,得到的数量不一致。
事务隔离级别
-
读未提交: 一个事务的更新语句没有提交,但是别的事务可以读到这个改变;
-
读已提交: 一个事务只能看到其他事务已经提交的更新、看不到未提交的更新,消除了脏读和回滚丢失,Oracle/Sqlserver就是此类;
-
可重复读: 一个事务中进行两次或多次同样的对于数据内容的查询,得到的结果是一样的,但不保证对于数据条数的查询是一样的,只要存在读改行数据就禁止写,消除了不可重复读和覆盖丢失。
-
串行化: 事务执行不允许其他事务操作,只要存在读就禁止写,但可以同时读,消除了幻读,但是效率太低。
隔离级别 回滚丢失 脏读 不可重复读 覆盖丢失 幻读 读未提交 否 否 否 否 否 读已提交 是 是 否 否 否 可重复读 是 是 是 是 否 串行化 是 是 是 是 是