事务就是以可控的方式对数据资源进行访问的一组操作。为了保证事务执行前后,数据资源所承载的系统状态始终处于“正确”状态,事务本身持有 4 个限定属性,即:原子性(Atomicity),一致性(Consistency),隔离性(Isolation),持久性(Durability)。即 ACID

 

1,原子性

 

要求事务所包含的全部操作是一个不可分割的整体,要么全部提交成功,要么只要有一个操作失败,就全部失败。

 

2,一致性

 

要求事务所包含的操作不能违反数据资源的一致性检查,数据资源在事务执行之前处于某个数据一致性状态,那么,事务执行之后也依然需要保持数据间的一致性状态。

 

3,隔离性

 

事务的隔离性主要规定了各个事务之间相互影响的程度。主要面向对数据资源的并发访问,并兼顾影响事务的一致性,不同的隔离级别决定了各个事务对该数据资源的访问行为。

 

  • Read Uncommitted:最低的隔离级别,最直接的效果就是,一个事务可以读取另一个事务没有提交的更新结果。无法避免的问题:
    • 脏读(Dirty Read):如果一个事务对数据进行了更新,但事务没有提交,另一个事务就可以“看到”该事务没有提交的更新结果,会造成,如果第一个事务回滚,那么第二个事务在此之前所“看到”的数据就是“脏”数据;
    • 不可重复读取(Non-Repeatable Read):是指同一个事务在整个事务过程中对同一笔数据进行读取,每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据,在事务2的更新操作之后再读取同一笔数据一次,两次结果是不同的,因此,Read Uncommitted 也无法避免不可重复读取的问题;
    • 幻读(Phantom Read):指同样一个查询在整个事务过程中多次执行后,查询的结果集不一样。幻读针对的是多笔记录。在 Read Uncommitted 隔离级别下,不管事务2的插入操作是否提交,事务1在插入之前和之后执行相同的查询,取得的结果集都是不同的,所以,Read Uncommitted 无法避免幻读的问题;
  • Read Committed:该级别为大部分数据库采取的默认隔离级别,在此隔离级别下,一个事务的更新操作结果只有在该事务提交之后,另一个事务才可能读取到同一笔数据更新后的结果。Read Committed 可以避免 脏读问题,但无法避免不可重复读 幻读 问题;
  • Repeatable Committed:该隔离级别可以保证在整个事务的过程中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对同一笔数据进行更新,也不管其他事务对同一笔数据的更新提交与否。Repeatable Committed 级别可避免 脏读 不可重复读,但是无法避免 幻读;
  • Serializable:最为严格的隔离级别,所有的事务操作必须依次顺序执行,可避免其他隔离级别遇到的所有问题,是最为安全的隔离级别,但也是性能最差的。

 

对于数据库来说,通常都有一个默认的隔离级别。EJBSpringJDBC 等数据访问方式,都允许为事务指定以上提到的 4 个隔离级别,但最终事务是否以指定的隔离级别执行,是由底层的数据源决定的。

 

关于事务ACID初了解_事务

 

在具体实践中,是根据系统情况调整隔离级别,保证系统性能与数据一致性之间的平衡。

 

4,持久性

 

一旦整个事务操作成功提交,对数据所做的变更将被记载并不可逆转。