【Spring5学习笔记(4)】事务管理:


事务
1、什么是事务
(1)事务是数据库操作的最基本单元,是逻辑上的一组操作,要么都成功,如果有一个失败则所有操作都失败
(2)经典场景:银行转账
2、事务的四个特性(ACID)
(1)原子性:一组逻辑操作不可分割
(2)一致性:数据操作前后总数一致
(3)隔离性:多事务操作时互相不产生影响
(4)持久性:提交之后表中数据永久改变

事务操作(搭建事务操作环境)
1、创建数据库表,添加记录
2、创建service、创建dao,完成对象的创建和注入
(1)service注入dao,在dao注入jdbcTemplate,在jdbcTemplate注入DataSource
(2)@Service
public class UserService {
@Autowired
private UserDao userDao;
}
(3)@Repository
public class UserDaoImpl implements UserDao{
@Autowired
private JdbcTemplate jdbcTemplate;
}
3、在Dao创建两个方法,一个是多钱一个是少钱,在Service创建方法(转账的方法)
4、代码如果正常执行则没有问题,如果在转账过程中出现异常等
(1)所以需要引入事务来解决
(2)事务操作过程
第一步 开启事务
第二步 进行业务操作
第三步 没有发生异常则提交事务
第四步 出现异常事务回滚

事务操作(Spring事务管理介绍)
1、事务添加到javaee三层结构里面的service层

2、在spring进行事务管理操作
有两种方式:编程式事务管理和声明式事务管理(使用)

3、声明式事务管理
(1)基于注解方式(使用)
(2)基于xml配置文件方式

4、在Spring进行声明式事务管理,底层使用aop

5、spring事务管理api
提供一个接口,代表事务管理器,这个接口针对不同的框架提供不同的实现类
PlatformTransactionManager

事务操作(注解声明式事务操作)
1、在spring配置文件中配置事务管理器
创建事务管理器
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
注入数据源
<property name="dataSource" ref="dataSource"></property>
</bean>

2、在spring配置文件,开启事务注解
(1)在spring配置空间引入名称空间tx
(2)开启事务注解
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>

3、在service类上面(获取service类里面方法上面)添加事务注解
(1)@Transacitonal,这个注解添加到类上面,也可以添加到方法上面
(2)如果把这个注解添加到类上面,这个类里面所有的方法都添加事务
(3)如果把这个注解添加方法上面,则只为这个方法添加

事务操作(声明式事务管理参数配置)
1、propagation:事务的传播行为
当一个事务方法被另一个事务方法调用的时候,这个事务方法如何进行
事务的传播行为可以由传播属性指定,spring定义了7种类传播行为
REQUIRED 如果有事务在运行,当前方法就在这个事务内运行,否者,就启动一个新的事务,并在自己的事务中运行
REQUIRED_NEW 在当前的方法必须启动新事务,并在他自己的事务内运行,如果有事务正在运行,则应该将它挂起
SUPPORTS 如果有事务在运行,当前的方法就在这个事务内运行,否则他可以不运行在事务中
NOT_SUPPORTED 当前的方法不应该运行在事务中,如果有运行的事务,将它挂起
MANDATORY 当前的方法必须运行在事物内部,如果没有正在运行的事务,就抛出异常
NEVER 当前的方法不应该运行在事务中,如果有运行的事务,就抛出异常
NESTED 如果有事务在运行,当前的方法就应该在这个事务的嵌套事务内运行,否则,就启动一个新的事务,并在她自己的事务内运行
2、ioslation:事务隔离级别
(1)事务有特性称为隔离性,多事务操作之间不会产生影响,不考虑隔离性产生很多问题
(2)不考虑隔离性则存在三个问题:脏读、不可重复读、虚(幻)读
(3)脏读:一个未提交事务读取到另一个未提交事务的数据
(4)不可重复读:一个未提交事务读取到另一个提交事务修改数据
(5)幻读:一个未提交事务读取到另一提交事务添加数据
(6)通过设置事务隔离性,解决读问题

3、timeout:超时时间
(1)事务需要在一定时间内进行提交,如果不提交则进行回滚
(2)默认值是-1,设定时间以秒为单位计算

4、readOnly:是否只读
(1)读:查询操作,写:添加修改删除操作
(2)readOnly默认设置为false,表示可以查询,可以添加修改删除操作
(3)设置为true后,只能查询

5、rollbackFor:回滚
(1)设置出现哪些异常进行事务回滚

6、norollbackFor:不回滚
(1)设置出现哪些异常不进行事务回滚

事务操作(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="account*" propagation="REQUIRED"/>
</tx:attributes>
</tx:advice>
第三步 配置切入点和切面
<aop:config>
<aop:pointcut id="pt" expression="execution(* com.atguigu.spring5.service.UserService.*(..))"></aop:pointcut>
<aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor>
</aop:config>

事务操作(完全注解声明式事务管理)
1、创建配置类,使用配置类代替配置文件
@Configuration
@ComponentScan(basePackages = "com.atguigu.spring5.service")
@EnableTransactionManagement //开启事务
public class txConfig {
//创建数据库连接池
@Bean
public DruidDataSource druidDataSource(){
DruidDataSource dataSource = new DruidDataSource();
dataSource.setDriverClassName("com.alibaba.druid.pool.DruidDataSource");
dataSource.setUrl("jdbc:mysql://localhost:13306/user_db");
dataSource.setUsername("root");
dataSource.setPassword("123456");
return dataSource;
}

//创建jdbc连接对象
@Bean
public JdbcTemplate jdbcTemplate(DataSource dataSource){
//到ioc容器中根据类型找到dataSource
JdbcTemplate jdbcTemplate = new JdbcTemplate();
//注入dataSource
jdbcTemplate.setDataSource(dataSource);
return jdbcTemplate;
}

//创建事务管理器
@Bean
public DataSourceTransactionManager dataSourceTransactionManager(DataSource dataSource){
DataSourceTransactionManager dataSourceTransactionManager = new DataSourceTransactionManager();
dataSourceTransactionManager.setDataSource(dataSource);
return dataSourceTransactionManager;
}
}

原创文章,作者:ItWorker,如若转载,请注明出处:https://blog.ytso.com/281215.html

(0)
上一篇 2022年8月20日
下一篇 2022年8月20日

相关推荐

发表回复

登录后才能评论