一、事务的概念
事务事务是并发控制的单位,是用户定义的一个操作序列, 这些操作要么完全执行,要么完全不执行, 它是一个不可分割的工作执行单元。
二、事务的特性
事务有四大特性,简称ACID。
- 原子性(Atomicity):事务是一个原子操作,由一系列动作组成。事务的原子性确保动作要么全部完成,要么完全不起作用。
- 一致性(Consistency):一旦事务完成,系统确保它所建模的业务处于一致的状态,而不会是部分完成部分失败。
- 隔离性(Isolation):可能有许多事务会同时处理相同的数据,因此每个事务都应该与其他事务隔离开来,防止数据损坏。
- 持久性(Durability):一旦事务完成,无论发生什么系统错误,它的结果都不应该受到影响,这样就能从任何系统崩溃中恢复过来。
三、事务的隔离级别
事务的隔离级别由低到高依次为读未提交 、读已提交 、可重复读 、序列化 ,这四个级别可以逐个解决脏读 、不可重复读 、幻读这三个数据读取问题。
1.事务并发问题
- 脏读(Dirty Read):一个事务读取了另一个事务改写但尚未提交的数据。
- 不可重复读(Non-repeatable Read):一个事务执行两次相同的查询却返回了不同数据(数据内容不一致)。对应更新操作。
- 幻读(Phantom Read):一个事务执行两次相同的查询却返回了不同数据(数据总量不一致)。对应插入和删除操作。
2.隔离级别
- 读未提交(Read Uncommited):该隔离级别表示一个事务可以读取另一个事务修改但还没有提交的数据。该级别不能解决这三类数据读取问题,因此很少使用该隔离级别。
- 读已提交(Read Commited):该隔离级别表示一个事务只能读取另一个事务已经提交的数据,避免了脏读的问题。
- 可重复读(Repeatable Read):该隔离级别表示一个事务在整个过程中可以多次重复执行某个查询,并且每次返回的记录都相同,防止了脏读和不可重复读。
- 序列化(Serializable):最高的隔离级别,所有的事务依次逐个执行,这样事务之间就完全不可能产生干扰。该级别可以防止脏读、不可重复读以及幻读。
四、事务的管理方式
1.编程式事务: 编程式事务管理可以使用TransactionTemplate模板类或者直接使用底层的PlatformTransactionManager 实现事务。
2.声明式事务:声明式事务是建立在 AOP 之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况“提交”或者“回滚”事务。声明式事务管理有两种常用的方式,一种是基于tx和aop命名空间的xml配置文件,一种是基于@Transactional注解。