1)事务传播:
1、REQUIRED :如果当前存在事务,则加入该事务;如果当前没有事务,则创建一个新的事务。
2、SUPPORTS :如果当前存在事务,则加入该事务;如果当前没有事务,则以非事务的方式继续运行。
3、MANDATORY :如果当前存在事务,则加入该事务;如果当前没有事务,则抛出异常。
4、REQUIRES_NEW :创建一个新的事务,如果当前存在事务,则把当前事务挂起。
5、NOT_SUPPORTED :以非事务方式运行,如果当前存在事务,则把当前事务挂起。
6、NEVER :以非事务方式运行,如果当前存在事务,则抛出异常。
2)事务隔离:
1、DEFAULT :默认值,表示使用底层数据库的默认隔离级别。对大部分数据库而言,通常这值是:READ_COMMITTED 。
2、READ_UNCOMMITTED :读取未提交数据(会出现脏读, 不可重复读) 基本不使用
3、READ_COMMITTED :读取已提交的数据(防止脏读,会出现不可重复读和幻读)大多数情况下使用。
4、REPEATABLE_READ :可重复读(会出现幻读可以防止脏读和不可重复读)。
5、SERIALIZABLE :所有的事务逐个执行(可以防止脏读、不可重复读以及幻读)影响性能,基本不使用。
脏读 : 一个事务读取到另一事务未提交的更新数据
不可重复读 : 在同一事务中, 多次读取同一数据返回的结果有所不同, 换句话说,
后续读取可以读到另一事务已提交的更新数据. 相反, "可重复读"在同一事务中多次
读取数据时, 能够保证所读数据一样, 也就是后续读取不能读到另一事务已提交的更新数据
幻读 : 一个事务读到另一个事务已提交的insert数据
一、传统的xml配置
<!--配置数据源-->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="url" value="jdbc:oracle:thin:@"/>
<property name="username" value="" />
<property name="password" value="" />
<property name="initialSize" value="20" />
<property name="minIdle" value="20" />
<property name="maxActive" value="200" />
<property name="poolPreparedStatements" value="true" />
<property name="timeBetweenEvictionRunsMillis" value="10000" />
<!-- 监控 -->
<property name="filters" value="stat" />
<property name="testOnBorrow" value="true" />
</bean>
<!--事务管理-->
<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<!-- 事务通知 -->
<tx:advice id="txAdivce" transaction-manager="txManager">
<tx:attributes>
<tx:method name="insert*" propagation="REQUIRED"/>
<tx:method name="update*" propagation="REQUIRED"/>
<tx:method name="delete*" propagation="REQUIRED"/>
<tx:method name="select*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
<!-- 事务切入 -->
<aop:config>
<!-- 切点(* 所有包、类或者方法) -->
<aop:pointcut expression="execution(* com.*.service.*.*(..))" id="txPointcut"/>
<!-- 通知 -->
<aop:advisor advice-ref="txAdivce" pointcut-ref="txPointcut"/>
</aop:config>
二、java注解配置:@Transactional
①事务隔离:例:@Transactional(isolation = Isolation.DEFAULT)
②事务传播:例:@Transactional(propagation = Propagation.REQUIRED)