1.什么是事务
(1)事务时数据库操作最基本的单元,逻辑上一组操作,要么都成功,要么都失败
(2)典型场景,银行转账
2. ACID
原子性
一致性
隔离性
持久性
3.搭建事务操作环境
1.创建数据库创建表
2.创建service,搭建dao,在dao注入JdbcTemplate,在JdbcTemplate注入DataSource
配置文件
<context:component-scan base-package="com.atguigu"></context:component-scan>
<bean id="dataSource" class="com.alibaba.druid.pool.DruidDataSource" destroy-method="close">
<property name="url" value="jdbc:mysql://user_db"/>
<property name="username" value="root"/>
<property name="password" value="123456"/>
<property name="driverClassName" value="com.mysql.jdbc.Driver"/>
</bean>
<bean id="jdbcTemplate" class="org.springframework.jdbc.core.JdbcTemplate">
<property name="dataSource" ref="dataSource"></property>
</bean>
3.在dao创建两个方法:多钱和少钱的方法,在service创建方法(转账)
@Service
public class UserService {
@Autowired
private UserDao userDao;
public void accountMoney(){
userDao.reduceMoney();
userDao.addMoney();
}
}
4.上面代码,如果执行没有问题的,但是代码执行过程中出现异常,有问题
(1)如何解决
*使用事务进行解决
(2)事务操作过程
public void accountMoney(){
try{
//第一步,开始事务
//第二步,进行业务操作
userDao.reduceMoney();
userDao.addMoney();
}catch (Exception e){
//第三步,没有异常,提交事务
}finally {
//第四步,出现异常,事务回滚
}
}
4.Spring事务管理介绍
1.事务添加到JavaEE三层结构里面的Service层(业务逻辑层)
2.在Spring进行事务管理操作
(1)有两种方式:编程式事务管理和声明式事务管理(使用)
3.声明式事务管理
(1)基于注解方式
(2)基于xml配置文件方式
4.在Spring进行声明式事务管理,底层使用AOP原理
5.Spring事务管理API
(1)提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
5.注解声明式事务管理
1.在spring配置文件事管理器
<!--创建事务管理器-->
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
2.在spring配置文件,开始事务注解
(1)在spring配置文件引入命名空间tx
(2)开启事务的注解
3.在service类上面添加事务注解
(1)@Transactional,这个注解可以添加到类上面,也可以添加到方法上面
@Service
@Transactional
public class UserService {
6.声明式事务管理参数配置
1.在service类上面添加注解@Transactional,在这个注解里面可以配置事务相关参数
-
propagation:事务传播行为
- 多事务方法直接进行调用,这个过程中事务时如何进行管理的
-
ioslation:事务隔离界别
- 事务由特性为隔离性,多事务操作之间不会产生影响不考虑隔离性产生很多问题:脏读,不可重复读,虚(幻)读
- 事务由特性为隔离性,多事务操作之间不会产生影响不考虑隔离性产生很多问题:脏读,不可重复读,虚(幻)读
-
timeout:超时时间
-
readOnly:是否只读
-
rollbackFor:回滚
- 设置哪些异常回滚
-
noRollbackFor:不回滚
- 设置哪些异常不回滚
7.xml声明式事务管理
1.在spring配置文件进行配置
第一步 配置事务管理器
<!--创建事务管理器-->
<bean id="TransactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<!--注入数据源-->
<property name="dataSource" ref="dataSource"></property>
</bean>
第二步 配置通知
<!--配置通知-->
<tx:advice id="txadvice">
<!--配置事务参数-->
<tx:attributes>
<!--指定哪种规则的方法上添加事务-->
<tx:method name="accountMoney" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
第三步 配置切入点和切面
<!--配置切入点和切面-->
<aop:config>
<!--配置切入点-->
<aop:pointcut id="pt" expression="execution(* com.atguigu.spring.service.UserService.*(..))"/>
<!--配置面-->
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"/>
</aop:config>
8.完全注解声明式事务管理
1.创建配置类,使用配置类替代xml
@Configuration
@ComponentScan(basePackages = "com.atguigu")//组件扫描
@EnableTransactionManagement//开启事务
public class txConfig {
//创建数据库连接池
@Bean
public DruidDataSource getDruidDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("");
dataSource.setUrl("");
dataSource.setUsername("");
dataSource.setPassword("");
return dataSource;
}
//创建jdbcTemplate对象
@Bean
public JdbcTemplate getJdbcTemplate(DataSource dataSource){
//到ioc容器根据类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}
//创建事务管理器
@Bean
public DataSourceTransactionManager getDataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager =
new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}
总结
注解:配置事务管理器----->开始事务注解------------>事务注解(@Transactional)
xml:配置事务管理器------>配置通知------------->配置切入点和切面