spring编程式事务:
1.创建TransactionTemplate模板
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<!-- 事务模板-->
<bean id="transactionTemplate" class="org.springframework.transaction.support.TransactionTemplate">
<property name="transactionManager" ref="transactionManager"/>
</bean>
然后在service层
@Autowired
private TransactionTemplate tstl;
//编程式事务
@Override
public void transfer(String sourceName, String targetName, Float money) {
//这里使用的式lambda表达式,接口是TransactionCallBack
tstl.execute((transactionStatus) -> {
try {
//根据名称查询转出用户
AccountInfo p = accountDao.findByName(sourceName);
//根据名称查询转入账户
AccountInfo ppp = accountDao.findByName(targetName);
//减钱
p.setMoney(p.getMoney() - money);
//收款方加钱
ppp.setMoney(ppp.getMoney() + money);
accountDao.updateAccount(p);
int i = 10 / 0;
accountDao.updateAccount(ppp);
} catch (Exception e) {
e.printStackTrace();
transactionStatus.setRollbackOnly();
}
return null;
});
}
1.spring中基于xml的声明式事务配置步骤(声明式事务)
1.配置事务管理器
<!-- 1.配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.2、配置事务的通知
此时我们需要导入事务的约束 tx名称空间和约束,同时也需要aop的
使用tx:advice标签配置事务通知
属性:
id:给事务通知起一个唯一标识
transaction-manager:给事务通知提供一个事务管理器引用
<!-- 3.配置事务的通知-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<!-- 5.配置事务的属性
isolation:用于指定事务的隔离级别。默认值是DEFAULT,表示使用数据库的默认隔离级别。
propagation:用于指定事务的传播行为。默认值是REQUIRED,表示一定会有事务,增删改的选择。查询方法可以选择SUPPORTS。
read-only:用于指定事务是否只读。只有查询方法才能设置为true。默认值是false,表示读写。
timeout:用于指定事务的超时时间,默认值是-1,表示永不超时。如果指定了数值,以秒为单位。
rollback-for:用于指定一个异常,当产生该异常时,事务回滚,产生其他异常时,事务不回滚。没有默认值。表示任何异常都回滚。
no-rollback-for:用于指定一个异常,当产生该异常时,事务不回滚,产生其他异常时事务回滚。没有默认值。表示任何异常都回滚。
-->
<tx:attributes>
<!-- 作用所有-->
<tx:method name="*" propagation="REQUIRED" read-only="false"/>
<!-- 作用与查询方法上,方法需遵循find开头-->
<tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
</tx:attributes>
</tx:advice>
3.配置AOP中的通用切入点表达式
<!-- 4.配置aop-->
<aop:config>
<!-- 4.配置切入点表达式-->
<aop:pointcut id="pt1" expression="execution(* com.itheima.service.impl.*.*(..))"></aop:pointcut>
<!--建立切入点表达式和事务通知的对应关系 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
</aop:config>
spring中基于注解的声明式事务控制
<!-- spring中基于注解 的声明式事务控制配置步骤
1、配置事务管理器
2、开启spring对注解事务的支持
3、在需要事务支持的地方使用@Transactional注解
-->
<!-- 配置事务管理器 -->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
<aop:aspectj-autoproxy proxy-target-class="true"></aop:aspectj-autoproxy>
<!-- 开启spring对注解事务的支持-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
使用Transactional注解
作用于类或方法上
例如:
//只读型事务的配置
@Transactional(propagation=Propagation.SUPPORTS,readOnly=true)
//读写型事务配置
@Transactional(propagation=Propagation.RQUIRED,readonly=false)
spring全注解开发:
1.主配置文件
@Configuration
@ComponentScan(basePackages = "com.itheima")
@PropertySource("jdbc.properties")
@Import({JdbcConfig.class,TransactionManagerConfig.class})
@EnableTransactionManagement
public class SpringConfiguration {
}
2.加载jdbc配置
public class JdbcConfig {
@Value("${jdbc.driverClass}")
private String driverClass;
@Value("${jdbc.url}")
private String url;
@Value("${jdbc.username}")
private String username;
@Value("${jdbc.password}")
private String password;
/**
* 创建jdbcTemplate
* @param ds
* @return
*/
@Bean(name = "jdbcTemplate")
public JdbcTemplate createJdbcTemplate(DataSource ds) {
return new JdbcTemplate(ds);
}
/**
* 创建数据源并交给spring管理
* @return
*/
@Bean(name ="dataSource")
public DataSource createDateSource() {
DriverManagerDataSource ds = new DriverManagerDataSource(url,username,password);
return ds;
}
}
3.创建事务管理器
public class TransactionManagerConfig {
/**
* 创建事务管理器
* @param dataSource
* @return
*/
@Bean(name = "transactionManager")
public PlatformTransactionManager transactionManager(DataSource dataSource) {
return new DataSourceTransactionManager(dataSource);
}
}