注意:所有文章除特别说明外,转载请注明出处.
Spring源码 - 事务概述
事务首先是一系列操作组成的工作单元,该工作单元内的操作时不可分割的,要么所有操作都做,要么所有操作都不做,这就是事务。
ACID
并发操作
在并发操作过程中会出现如下问题:
1.丢失更新:两个事务更新同一行数据,最后一个事务的更新会覆盖第一个事务的更新。
2.脏读:一个事务看到另一个事务未提交的更新数据。
3.不可重复读:在同一事务中,多次读取同一个数据却返回不同的结果。其它事务更改这些数据。
4.幻读:一个事务在执行过程中读取到了另一个事务已提交的插入数据;即在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,即好像发生幻觉一样。
为了解决上面的问题,需要通过数据库隔离级别来解决。
1.未提交读:最低级别,一个事务能够读取到别的事务未提交的更新数据,所以这是不安全的,可能出现丢失更新、脏读、不可重复读、幻读。
2.提交读:一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,不可能出现丢失更新、脏读,但可能出现不可重复读、幻读。
3.可重复读:保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,不可能出现丢失更新、脏读、不可重复读,但可能出现幻读。
4.序列化:最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全,不可能出现更新、脏读、不可重复读、幻读。
注意:隔离级别越高,数据库事务并发执行性能越差,能处理的操作就越少。在实际项目中采用 提交读 的事务隔离级别,其能够避免丢失更新和脏度,尽管不能避免 不可重复读和幻读,但是可以在可能出现的场合使用 悲观锁和乐观锁 来解决这些问题。
Spring 事务管理
Spring 支持声明式事务和编程式事务类型。特性:Spring所有的事务管理策略类都继承自:org.springframework.transaction.PlatformTransactionManager接口。
…