事务概念
-
什么是事务
-
事务的四大特性(ACID)
-
事务操作(Spring事务管理介绍)
-
事务操作(注解声明式事务管理)
-
在Spring配置文件配置事务管理器
<!--创建事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dateSource"></property> </bean>
-
在Spring配置文件中引入名称空间tx
-
开启事务注解
<!--开启事务注解--> <tx:annotation-driven transaction-manager="transactionManger"></tx:annotation-driven>
-
在service类上面添加事务注解
- @Transactional,这个注解添加到类上面,也可以添加方法上面
- 如果把这个注解添加类上面,这个类里面所有的方法都添加事务
- 如果把这个注解添加到方法上面则,为这个方法添加事务
-
-
事务操作(声明式事务管理参数配置)
-
在service类上面添加注解@Transactional在这个注解中可以配置事务相关参数
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-0BI8kDaQ-1638845021752)(C:\Users\Master\AppData\Roaming\Typora\typora-user-images\image-20211205153716106.png)]
-
propagation:事务传播行为
-
多事务方法直接进行调用,这个过程是事务如何进行管理的
[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-i9odq48r-1638845021753)(C:\Users\Master\AppData\Roaming\Typora\typora-user-images\image-20211205162639283.png)]
@Service @Transactional(propagation = Propagation.REQUIRED) public class MoneyService {
-
-
ioslation:事务隔离级别
-
事务里面有特性,称为隔离性,多事务操作之前不会产生影响,不考虑隔离性会产生很多问题
-
有三个读的问题:脏读,不可重复读,虚(幻)读。
-
脏读:一个未提交的事务,读取到了另一个未提交事务的数据
-
不可重复读:一个未提交事务,读取到了另一个提交事务修改数据
-
虚读:一个未提交事务读取到另一个提交事务添加数据
-
通过设置事务的隔离性,就可以解决读的问题
@Service @Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.REPEATABLE_READ) public class MoneyService {
-
-
timeout:超时时间
- 事务需要在一定时间内进行提交,如果不提交进行回滚
- 默认值为-1,设置时间为以秒为单位计算
-
readOnly:是否只读
- 读:查询操作,写:添加修改删除,操作
- readOnly默认值为false,表示可以查询,可以添加修改删除操作
- 设置readOnly值为true,设置为true后只能查询
-
rollbackFor:回滚
- 设置出现哪些异常进行事务回滚
-
noRollbackFor:不回滚
- 设置出现哪些异常不进行事务回滚
-
-
事务操作(XML声明式事务管理)
-
在spring配置文件中进行配置
-
配置事务管理器
-
<!--创建事务管理器--> <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dateSource"></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.dxz.demo.service.MoneyService.*(..))"/> <!--切入面--> <aop:advisor advice-ref="txadvice" pointcut-ref="pt"></aop:advisor> </aop:config>
-
-
-
事务操作(完全注解声明式事务管理)
-
创建配置类,使用配置类替代xml配置文件
-
首先描写注解
@Configuration @ComponentScan(basePackages = "com.dxz.demo")//组件扫描 @EnableTransactionManagement//开启事务 public class Config {
-
然后配置数据池
@Bean public DruidDataSource getDruidDataSource(){ DruidDataSource druidDataSource = new DruidDataSource(); druidDataSource.setUrl("jdbc:mysql://localhost:3306/dxz?characterEncoding=utf8"); druidDataSource.setDriverClassName("com.mysql.jdbc.Driver"); druidDataSource.setUsername("root"); druidDataSource.setPassword("DXZDXZ4811"); return druidDataSource; }
-
然后创建JdbcTemplate对象
@Bean public JdbcTemplate getJdbcTemplate(DataSource dataSource){ JdbcTemplate jdbcTemplate = new JdbcTemplate(); jdbcTemplate.setDataSource(dataSource); return jdbcTemplate; }
-
创建事务管理器
@Bean public DataSourceTransactionManager getManager(DataSource dataSource){ DataSourceTransactionManager manager = new DataSourceTransactionManager(); manager.setDataSource(dataSource); return manager; }
-
测试类,context获取方法改变了
@Test public void testMoney(){ ApplicationContext context = new AnnotationConfigApplicationContext(Config.class); MoneyService moneyService = context.getBean("moneyService",MoneyService.class); moneyService.exchange(); }
-
-