ICode9

精准搜索请尝试: 精确搜索
首页 > 其他分享> 文章详细

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

2022-08-20 16:00:08  阅读:160  来源: 互联网

标签:事务管理 事务 笔记 添加 dataSource 操作 运行 Spring5


事务
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;
}
}

标签:事务管理,事务,笔记,添加,dataSource,操作,运行,Spring5
来源: https://www.cnblogs.com/ricc/p/16607908.html

本站声明: 1. iCode9 技术分享网(下文简称本站)提供的所有内容,仅供技术学习、探讨和分享;
2. 关于本站的所有留言、评论、转载及引用,纯属内容发起人的个人观点,与本站观点和立场无关;
3. 关于本站的所有言论和文字,纯属内容发起人的个人观点,与本站观点和立场无关;
4. 本站文章均是网友提供,不完全保证技术分享内容的完整性、准确性、时效性、风险性和版权归属;如您发现该文章侵犯了您的权益,可联系我们第一时间进行删除;
5. 本站为非盈利性的个人网站,所有内容不会用来进行牟利,也不会利用任何形式的广告来间接获益,纯粹是为了广大技术爱好者提供技术内容和技术思想的分享性交流网站。

专注分享技术,共同学习,共同进步。侵权联系[81616952@qq.com]

Copyright (C)ICode9.com, All Rights Reserved.

ICode9版权所有