【1】Spring中是自带事务控制的,事务控制,通俗易懂的来说,就是一个方法如果没有事务控制,运行出错的时候,数据库的数据会改变,但是控制面板报错,不执行接下来的语句了。而我们的目的是让他不报错的时候正常修改数据库,报错的时候,不修改数据库。
【2】在没有Spring支持的时候,我们需要自写一个Connection类,来获取当的连接,存入ThreadLocal中,当方法执行完后,在把连接和线程断开。然后利用这个类中的方法,开启事务,关闭事务,回滚事务,提交事务。
【3】但是当我们有了Spring之后,我们就可以用Spring的内置的TX标签,前提是,需要导入tx的约束。
配置tx事务控制的步骤是
1)配置事务管理器-传入dataSource数据源
2)配置事务的通知,需要导入tx约束
3)配置AOP的通用切入点表达式
4)建立事务通知和切入点表达式的对应关系
5)配置事务的属性
属性: isolation:隔离级别,默认级别是Default,使用数据库的默认隔离级别 propagation:用于指定事务的传播行为,默认值为Required,表示一定会有事务,增删改查的选择,查询方法用Supports值 read-only:用于指定事务是否只读,只有查询方法才能设置为true,默认值为false,表示读写 timeout:用于指定,事务的超时时间,默认是-1,表示永不超时,秒为单位 rollback-for:只用指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚.没有默认值,表示任何异常都回滚 no-rollback-for:用于指定一个异常,当产生该异常时,不回滚.其他异常回滚.没有默认值,表示任何异常都回滚
<!--1.配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="DataSource"></property>
</bean>
<!--2.配置事务的通知,需要导入tx约束-->
<!--属性transcation-manager是给事务通知一个事务管理器引用-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!--5.配置事务的属性-->
<tx:attributes>
<!--name是业务层中的方法,可以用*代替-->
<tx:method name="*" propagation="REQUIRED" read-only="false" />
<tx:method name="find*" propagation="SUPPORTS" read-only="true" />
</tx:attributes>
</tx:advice>
<!--3.配置Aop的通用切入点表达式-->
<aop:config>
<aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.*.*(..))"></aop:pointcut>
<!--4建立事务通知和切入点表达式的对应关系-->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>
这样我们就达到了我们想要的事务控制的目的了