目录
Spring事务编程概述
基于xml声明式事务控制
事务属性
isolation
timeout
read-only
propagation
全注解开发
Spring事务编程概述
事务是开发中必不可少的东西,使用JDBC开发时,我们使用connection对事务进行控制,使用MyBatis时,我们使用SqlSession对事务进行控制,缺点显而易见,当我们切换数据库访问技术时,事务控制的方式总会变化
基于xml声明式事务控制
结合上面学习的AOP技术,我们可以对Service的方法进行事务的增强
-
目标类:自定义的AccountServiceImpl,内部方法是切点
-
通知类:Spring提供的,通知方法已经定义好的,只需配置
步骤:
1.导入Spring事务的相关的坐标
2.配置目标类AccountServiceImpl
3.使用advisor标签配置切面
(为什么用advisor标签配置切面?)
假设使用aspect的话需要一个通知类,一级配置一系列通知方法标签
而advisor只需要实现接口重写方法就可以,配置简单
<!-- 包扫描 -->
<context:component-scan base-package="com.xfy"></context:component-scan>
<!-- JDBC.properties -->
<context:property-placeholder location="classpath:jdbc.properties"></context:property-placeholder>
<!-- 整合Mybatis-->
<!-- SqlSessionFactory -->
<bean class="org.mybatis.spring.SqlSessionFactoryBean">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- mapper -->
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer">
<property name="basePackage" value="com.xfy.mapper"></property>
</bean>
<!-- dataSource -->
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource">
<property name="driverClassName" value="${jdbc.driver}"/>
<property name="url" value="${jdbc.url}"/>
<property name="username" value="${jdbc.username}"/>
<property name="password" value="${jdbc.password}"/>
</bean>
<!-- 配置平台事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- Spring提供好的事务增强(通知)-->
<tx:advice id="myadvice" transaction-manager="transactionManager">
<tx:attributes>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
<!-- 事务增强的aop -->
<aop:config>
<!-- 切点 -->
<aop:pointcut id="transforMoney" expression="execution(void com.xfy.service.impl.AcountServiceImpl.transforMoney(..))"/>
<aop:advisor advice-ref="myadvice" pointcut-ref="transforMoney"></aop:advisor>
</aop:config>
其中有注释可以了解一下
<!-- Spring提供好的事务增强(通知)-->
<tx:advice id="myadvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- 配置事务属性 -->
<!-- name:方法名 * 通配符 ( 添加操作 addXXX addYYY addZZZ => add* )-->
<!-- 下面·这个意味着对transforMoney方法配置独属于她的事务属性-->
<!-- 从上往下匹配 匹配到就不往下 -->
<tx:method name="transforMoney" isolation="READ_COMMITTED" timeout="3" read-only="false" propagation="REQUIRED"/>
<tx:method name="*"/>
</tx:attributes>
</tx:advice>
事务属性
这个补充一下事务属性👍👍👍👍😏
isolation
timeout
超时时间,默认为-1(没有超时时间) 单位:秒(s)😊
read-only
是否只读,查询操作才只读,其他默认
propagation
事务传播行为,解决业务方法调用业务方法(事务嵌套问题)
全注解开发
@Configuration
@ComponentScan(basePackages = {"com.xfy"})
@MapperScan(basePackages = {"com.xfy.mapper"})
@PropertySource("classpath:jdbc.properties")
@EnableTransactionManagement//事务自动管理
public class SpringConfig {
@Bean
public DataSource dataSource(
@Value("${jdbc.driver}") String driver,
@Value("${jdbc.url}") String url,
@Value("${jdbc.username}") String username,
@Value("${jdbc.password}") String password
){
DruidDataSource dataSource=new DruidDataSource();
dataSource.setDriverClassName(driver);
dataSource.setUrl(url);
dataSource.setUsername(username);
dataSource.setPassword(password);
return dataSource;
}
@Bean
public SqlSessionFactoryBean sqlSessionFactoryBean(DataSource dataSource){
SqlSessionFactoryBean sqlSessionFactoryBean=new SqlSessionFactoryBean();
sqlSessionFactoryBean.setDataSource(dataSource);
return sqlSessionFactoryBean;
}
@Bean
public DataSourceTransactionManager transactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager=new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}