事务的概念
什么叫事务
事务指逻辑上的一组操作,组成这组操作的各个单元,要不全部成功,要不全部不成功。
事务的特性
原子性
事务是数据库的逻辑工作单位,而且是必须是原子工作单位,对于其数据修改,要么全部执行,要么全部不执行。
一致性
事务在完成时,必须是所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。
隔离性
一个事务的执行不能被其他事务所影响。
持久性
一个事务一旦提交,事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。
Spring的事务管理
编程式事务
自己写代码来控制(不可取)
在 Spring 出现以前,编程式事务管理对基于 java 的应用来说是唯一选择。
用过 JDBC 的人都知道 connection.setAutoCommit(false)、commit()、rollback()
声明式事务
不用在java程序代码中体现事务的commit与rollback
Spring 的声明式事务管理在底层是建立在 AOP 的基础之上的。其本质是对方法前后进行拦截,然后在目标方法开始之前创建或者加入一个事务,在执行完目标方法之后根据执行情况提交或者回滚事务。
声明式事务例子:
引入所支持jar包
1. 声明一个事务管理器并注入数据源
2. 配置事务的转播属性
3. 配置切入点
DataSourceTransactionManager事务管理器
<!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!-- 事务传播属性 --> <tx:advice id="txAdvice" transaction-manager="transactionManager"> <tx:attributes> <tx:method name="*" propagation="REQUIRED" /> </tx:attributes> </tx:advice> <!-- 设置切入点 --> <aop:config> <aop:pointcut id="point" expression="execution(* com.service.PersonServiceImpl.*(..))" /> <aop:advisor advice-ref="txAdvice" pointcut-ref="point" /> </aop:config> |
注意:要想事务回滚,必须往外抛出异常,不能try..catch,(可以try住,但是要自己thorw)
注解式事务
<!—启动注释事务 -->
<tx:annotation-driven transaction-manager="transactionManager" />
<!—注解使用-->
@Transactional(propagation=Propagation.REQUIRED,timeout=30)
public void insert() {//省略}
<!-- 事务管理器 --> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean> <!--启动注解事务 --> <tx:annotation-driven transaction-manager="transactionManager" /> |
Transactional明细说明:
属性名 | 说明 |
isolation | 事务隔离级别 |
noRollbackFor | 一组异常类,遇到时不回滚。默认为{} |
noRollbackForClassName | 一组异常类名,遇到时不回滚,默认为{} |
propagation | 事务传播行为 |
readOnly | 事务读写性 |
rollbackFor | 一组异常类,遇到时回滚 |
rollbackForClassName | 一组异常类名,遇到时回滚 |
timeout | 超时时间,以秒为单位 |
value | 可选的限定描述符,指定使用的事务管理器 |
事务的传播属性(行为)
REQUIRED
表示当前方法必须要在事务中运行,如果当前有事务,就采用当前的事务。如果当前没有事务,就创建一个新事务。
支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
REQUIRES_NEW
表示当前方法,必须要在新事务中运行,如果当前已经存在事务,把当前事务挂起。
SUPPORTS
表示当前方法,可以在事务环境中运行,也可以在非事务环境中运行。如果当前存在事务,就在当前事务中运行。如果当前没有事务,就以非事务方式执行。
NOT_SUPPORTED
表示当前方法,必须要在以非事务方式执行,如果当前存在事务,就把当前事务挂起。
NEVER
表示当前方法,必须以非事务方式执行,如果当前存在事务,则抛出异常。
MANDATORY
表示当前方法,一定要在事务中运行,如果当前有事务,就采用当前事务,如果当前没有事务,就抛出异常。
NESTED
事务的隔离级别
Isolation.DEFAULT
这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
另外四个与JDBC的隔离级别相对应
Isolation.UNCOMMITTED:
这是事务最低的隔离级别,它充许令外一个事务可以看到这个事务未提交的数据。
这种隔离级别会产生脏读,不可重复读和幻像读。
Isolation.READ_COMMITTED:
保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
Isolation. REPEATABLE_READ:
这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。
它除了保证一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。
Isolation. SERIALIZABLE
(想要学习更多的后台基础的可搜索博客号:weixin_41920152)