1.什么是事务
事务保证多条sql语句 要么执行,要么都不执行!
四大特性:高频面试题
-
原子性: 不可分割,sql语句 要么执行,要么都不执行
-
一致性 : 转账例子 a 向 b 转 100 a必须减100 b增加100 a和b总数不表
-
隔离性: 多个sql连接之间的数据影响 一个sql连接 开启事务在修 id 为 1的 学生,改连接未提交事务 ,另外的sql不能访问到 未提交事务的 数据 sql 连接的隔离
-
持久性 : 提交之后数据可以持久保存,掉电不丢失
开启事务
1.配置事务管理器
<!-- 开启事务-->
<!--1.配置事务管理器-->
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"></property>
</bean>
2.注解式事务
<!-- 2.开启事务相关注解-->
<tx:annotation-driven transaction-manager="transactionManager"></tx:annotation-driven>
使用
package com.qfedu.service.impl;
import com.qfedu.dao.AccountDao;
import com.qfedu.service.AccountService;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Service;
import org.springframework.transaction.annotation.Isolation;
import org.springframework.transaction.annotation.Propagation;
import org.springframework.transaction.annotation.Transactional;
@Service
public class AccountServiceImpl implements AccountService {
@Autowired
private AccountDao accountDao;
/**
* propagation 事务的传播行为 调用方法之间 开的事务 是否会 传播其他被调用的方法上
* Propagation.REQUIRE 必须开启事务 如果当方法被其他调用 ,但是其他方法 没有开启事务 当前方法自己开启事务
* 如果当方法被其他调用 ,但是其他方法 其他方法开启事务 当前方法使用 被调用方法事务 自己无需开启
* Propagation.SUPPORTS 被调用的方法 开启了事务 就使用原有事务
* 被调用的方法 没有事务 不使用事务
*
* isolation 隔离级别 解决是 多个sql连接之间 事务允许参数据的程度
* Isolation.READ_COMMITTED 读已提交
*
* readOnly = false
* readOnly true 效率高 主要用于查询
* false 用于修改
*
* timeout 未事务设置超时
*
* @param fromId
* @param toId
* @param money
* @return
*/
// 在当前方法开启 事务
@Transactional(propagation = Propagation.REQUIRED,isolation = Isolation.READ_COMMITTED,readOnly = false)
@Override
public boolean transMoney(int fromId, int toId, float money) {
// 减钱
int num1 = accountDao.updateAccount(fromId,-money);
int a = 1/0;
// 加钱
int num2 = accountDao.updateAccount(toId,money);
if (num1 >0 & num2>0){
return true;
}
return false;
}
}
3.使用aop 配置事务
<!--开启事务注解 第二种方式-->
<tx:advice id="txAdvice" transaction-manager="transactionManager">
<tx:attributes>
<!-- name:*表示任意方法名称 -->
<tx:method name="*" propagation="REQUIRED"
isolation="DEFAULT" read-only="false" />
</tx:attributes>
</tx:advice>
<!-- 6.编写aop,让spring自动对目标生成代理,需要使用AspectJ的表达式 -->
<aop:config>
<!-- 切入点 -->
<aop:pointcut expression="execution(* com.qfedu.service.impl.*.*(..))"
id="txPointCut" />
<!-- 切面:将切入点与通知整合 -->
<aop:advisor advice-ref="txAdvice" pointcut-ref="txPointCut" />
</aop:config>
propagation 事务的传播行为
调用方法之间 开的事务 是否会 传播其他被调用的方法上
1、Propagation.REQUIRE 必须开启事务(适用增删改)
1、1如果当方法被其他调用 ,但是其他方法 没有开启事务 当前方法自己开启事务
1、2如果当方法被其他调用 ,但是其他方法 其他方法开启事务 当前方法使用 被调用方法事务 自己无需开启
2、Propagation.SUPPORTS 不一定开启事务(适用查询)
2、1被调用的方法 开启了事务 就使用原有事务
2、2被调用的方法 没有事务 不使用事务
isolation 事务的隔离级别
作用: 解决是 多个sql连接之间 事务允许脏数据的程度
先简单说一下脏数据的程度吧
1、脏读
:一个事务读取到另一个事务未提交的数据
2、不可重复读
:在一个事务中,反复读取同一条数据,两次结果不一致
3、幻影读
:3、1、在同一个事务中,按同一条件查询,有多条结果
,按同一条件查询,两次结果数量不一致
事务隔离级别
1、READ_UNCOMMITTED、读未提交
:一个事务读取到另一个事务未提交的数据,
无隔离,容易脏数据
2、READ_COMMITTED 读已提交
:一个事务读取到另一个事务提交的数据,解决脏读问题,
3、REPEATABLE_READ 、
:可以解决脏读和不可重复读,不能解决幻影读
4、SERIALIZABLE、
:可以解决脏读和不可重复读,幻影读

本文深入讲解了事务的基本概念及其四大特性:原子性、一致性、隔离性和持久性,并通过实例介绍了如何在Spring框架下配置和使用事务管理器进行事务控制。
841

被折叠的 条评论
为什么被折叠?



