事务
事物在开发中十分重要,为了确保项目的稳定,解耦和维护,事物的管理不能缺少
事物拥有四个属性:ACID
- A(atomicity):原子性:一个原子事务要么完整执行,要么干脆不执行。
- C(consistency):一致性:一致性代表了底层数据存储的完整性。
- I(isolation) :隔离性: 意味着事务必须在不干扰其他进程或事务的前提下独立执行
- D(durability):持久性:表示在某个事务的执行过程中,对数据所作的所有改动都必须在事务成功结束前保存至某种物理存储设备。
如果我们在执行代码对数据库进行操作时,先执行删除语句,后执行添加语句,可添加语句报错,但删除语句还是会执行,这就违反了事务的原子性。
Spring就拥有对事物管理的能力
Spring中的事务管理
要想使用Spring的事务管理需要在配置页面导入对应的头文件
xmlns:tx="http://www.springframework.org/schema/tx"
http://www.springframework.org/schema/tx
http://www.springframework.org/schema/tx/spring-tx.xsd">
设置JDBC事务:
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
配置相对应方法和对应事务:
<tx:advice id="advice_test" transaction-manager="transactionManager">
<tx:attributes>
<!--配置哪些方法使用什么样的事务,配置事务的传播特性-->
<!-- 方法名前缀 事务传播类型-->
<tx:method name="add" propagation="REQUIRED"/>
<tx:method name="delete" propagation="REQUIRED"/>
<tx:method name="*" propagation="REQUIRED"/>
<!-- *代表所有方法-->
</tx:attributes>
</tx:advice>
Spring中事务的传播类型有许多,其中REQUIRED是最常使用的,
- propagation_requierd:如果当前没有事务,就新建一个事务,如果已存在一个事务中,加入到这个事务中,这是最常见的选择。
- propagation_supports:支持当前事务,如果没有当前事务,就以非事务方法执行。
- propagation_mandatory:使用当前事务,如果没有当前事务,就抛出异常。
- propagation_required_new:新建事务,如果当前存在事务,把当前事务挂起。
- propagation_not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
- propagation_never:以非事务方式执行操作,如果当前事务存在则抛出异常。
- propagation_nested:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与propagation_required类似的操作
我们可以以AOP(切面编程)的方式把事务配置织入到指定的包与类中,让事务管理在指定的地方生效
<!--配置aop织入事务-->
<aop:config>
<aop:pointcut id="pointcut_test" expression="execution(* com.nicht.mapper.*.*(..))"/>
<aop:advisor advice-ref="advice_teste" pointcut-ref="pointcut_test"/>
</aop:config>