1.声明式事务
申明式事务,底层采用的是AOP,动态代理技术支持事务。
AOP中,Spring唯一可以提供的动态代理技术支持,就是代码固定的事务管理,spring提供切面类。
被增强类为业务层代码,增删改必须实现事务支持。
2.基于全XML方式__spring配置文件
1.创建spring提供的切面类bean,DataSourceTransactionManager,交给IOC容器管理。
为事务管理器,配置一个连接池,比如druid。
创建自己写的类bean,被增强类。
2.事务配置到具体方法上,并配置事务的特性。
3.配置事务特性、配置AOP实现事务。
配置文件实现如下:
<bean id="AccountService" class="cn.itcast.service.impl.AccountServiceImpl">
<bean id="transactionManager" class="...DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:atributes>
<tx:method name="add" isolation="" timeout="" read-only="" propagation=""/>
<tx:method name="find*" isolation="" timeout="" read-only="" propagation=""/>
</tx:atributes>
<tx:advice/>
<aop:config>
<aop:pointcut id="pt" expresition="excution( * cn.itcast..save(..))"/>
<aop:advisor advisor-ref="logger" pointcut-ref="pt"></aop:advisor>
</aop:config>
1.补充
接口类:PlatFormTransactionManager
DataSourceTransactionManager:给JdbcTemplate和Mybatis使用
HibernateTransacntionManager:给Hibernate框架使用
JPATransacntionManager:针对所有ORM关系型数据库
2.补充
事务的特性:原子性、一致性、持久性、隔离性。
隔离级别: 1.脏读:读未提交的数据。 企业开发必须解决。
2.解决脏读:读已提交数据。 oracle默认设置的隔离级别。
3.解决脏读、解决不可不重复读:能够重复读已提交数据。mysql默认设置的隔离级别。
4.解决所有问题:序列化。 但是开发中不用,效率最低。
isolation: 一般设置为默认,DEFAULT。按照数据库的默认隔离界别。
timeout: 设置为-1。 开发中需要设置为永不超时。
read-only: 查询的方法,设置为true。因为不考虑增删改,操作数据库很快,
propagation: 增删改设置为REQUIRED;查询设置为SUPPORT。
事务的传播行为:当前方法如果是增删改,当前方法必须将事务传播给调用的方法中;
当前方法如果是查询,当前方法支持将事务传播给调用的方法中;
3.半XML半注解方式_spring配置文件
半XML:配置第三方框架的类bean,spring自己提供的类也是第三方的。 (spring的事务管理器)
开启IOC容器扫描、开启事务注解(不需要开启AOP注解,事务包含)
半注解:配置自己写的类bean,以及配置spring的事务特性;(@Transactional)
1.开启IOC容器扫描、事务注解驱动,配置第三方类bean。
2.在需要事务的类或者方法上使用@Transactional注解配置事务
<context:component-scan base-package="cn.itcast"></context:component-scan >
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
<bean id="transactionManager" class="...DataSourceTransactionManager">
<property name="dataSource" ref="dataSource" />
</bean>
配置在类上:如果一个类,全部都是查询方法、或者一个类全部都是增删改。
配置在方法上:我们一般都配置在方法上。
增删改的事务配置:
@Transactional(isolation=Isolation.DEFAULT,TIMEOUT=-1,readOnly=false,
propagation=Propagation.REQUIRED)
查询的事务配置:
@Transactional(isolation=Isolation.DEFAULT,TIMEOUT=-1,readOnly=true,
propagation=Propagation.SUPPORT)
4.纯注解方法_spring配置类
@Configuration
@ComponentScan(basePackages = "cn.itcast")
@EnableTransactionManagement
@PropertySource(value = "classpath:jdbc.properties")
public class SpringConfig {
@Value(value = "${jdbc.driver}")
private String driver;
@Value(value = "${jdbc.url}")
private String url;
@Value(value = "${jdbc.username}")
private String username;
@Value(value = "${jdbc.password}")
private String password;
@Bean(value = "driverManager")
public DataSource createDataSource(){
DriverManagerDataSource driverManagerDataSource = new DriverManagerDataSource();
driverManagerDataSource.setDriverClassName(driver);
driverManagerDataSource.setUrl(url);
driverManagerDataSource.setUsername(username);
driverManagerDataSource.setPassword(password);
return driverManagerDataSource;
}
@Bean(value = "jdbcTemplate")
public JdbcTemplate createJdbcTemplate(@Qualifier(value = "driverManager") DataSource ds){
return new JdbcTemplate(ds);
}
@Bean(value = "transactionManager")
public DataSourceTransactionManager createDataSourceTransactionManager(@Qualifier(value = "driverManager") DataSource ds){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(ds);
return dataSourceTransactionManager;
}
}