事务

1:认识事务

可以把一系列要执行的操作称为事务,儿事务管理就是管理执行操作要么完全执行,要么完全不执行(很经典的一个例子:A要给B转钱,实现A的钱钱减少了,但是突然的数据库断电了,导致无法给B转钱,然后由于丢失数据,B不承认收到A的钱,在这里事务减少确保加钱和减钱两个都完全执行或者完全不执行,如果加钱失败,那么不会发生减钱)。

事务管理的意义:保证数据操作的完整性。一致性。

事务管理的四大特性:(面试题)ACID

原子性:事务的整个操作是一个整体,不可以分割,要么全部成功,要么全部失败。

一致性:事务操作的前后,数据表中的数据没有变化。

隔离性:事务操作是相互隔离不受影响的。

持久性:数据一旦提交,不可改变,永久的改变数据表中的数据。

事务管理操作:

开启事务管理:开启之后,下面的SQL语句并不会马上执行并把结果写到表中,而是会写到事务日志中。

start transaction;

回滚操作:会清掉开始事务管理之后写到事务日志中的内容,即恢复到开启事务管理之前。

语法: rollback; 如果程序发生了异常,将数据恢复到没有操作之前的那个状态

注意: 回滚操作只是回退“写” 的内容,对于普通的读表select语句不能回退

事务提交:将SQL语句的结果写到数据表中。

语法:commit--持久化的保存

当commit或rollback 语句执行后,事务会自动关闭

Spring事务管理机制:

Spring事务管理由三个接口共同完成:

 1) PlatformTransactionManager 平台相关事务管理器--事务管理器

 2)TransactionDefinition 事务定义信息(通过配置如何进行事务管理:隔离 传播 超时 只读)

 3)TransactionStatus 事务状态(事务管理过程中,每个时间点事务 状态信息)

 

 DataSourceTransationManager 针对JDBCTemplate.MyBatis事务控制,使用Connection进行事务控制

开启事务 conn.setAt=utoCommit(false)//conn 连接的事务管理

提交事务 conn.commit();

回滚事务 conn.rollback();

HibernateTransactionManager 针对Hibernate框架进行事务管理 使用Session的Transaction相关操作进行事务控制。

开启事务 session.beginTransaction();

提交事务 session.getTransaction().commit();

回滚事务 session.getTransaction().rollback();

TransactionDefinition事务定义信息

隔离级别获取 getlsolationLevel 传播行为获取 getPropagationBehavior 获取超时时间getTimeout isReadOnly 是否只读

事务的隔离级别:

 

 事务四大特性ACDI 隔离性引发问题----解决事务的隔离问题---隔离级别

Mysql默认隔离级别是repeatable_read

Oracle 默认隔离级别 read_committed

事务的传播行为

什么是事务的传播行为? 为什么需要? 事务传播行为用于解决两个被事务管理的方法互相调用问题

 

 

 

 面试题:required requires_new nested 区分

REQUIRED一个事务

REQUIRES_NEW 两个事务

NESTED 一个事务 事务可以设置保存点 回滚到保存点 选择提交或者回滚

事务的结束必须通过commit rollback作用标记为回滚

try{
//操作
  commit
}catch(){
  rollback
}

三个对象之间的关系

用户管理事务,需要先配置事务管理方案 TransactionDefinition,管理事务通过TransactionManager完成,TransactionManager 根据TransactionDefinition进行事务管理 在事务运行过程中,每个时间点都可以通过获取TransactionStatus了解事务运行状态!

Spring事务管理两种方式

Spring支持两种事务管理:编程式事务管理。声明式事务管理

编程式事务管理: 要修改原来的代码 加入事务管理代码(侵入性)---不推荐,不使用

声明式事务管理:底层是AOP的环绕通知---推荐

使用步骤:

1 XML配置方式添加事务管理(tx,aop约束)

<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns:context="http://www.springframework.org/schema/context"
    xmlns:aop="http://www.springframework.org/schema/aop"
    xmlns:tx="http://www.springframework.org/schema/tx"
    xsi:schemaLocation="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context.xsd
    http://www.springframework.org/schema/aop
    http://www.springframework.org/schema/aop/spring-aop.xsd
    http://www.springframework.org/schema/tx 
    http://www.springframework.org/schema/tx/spring-tx.xsd">

2 配置transactionManager(spring提供Around通知)

根据不同的持久层框架 配置不同的事务管理器 事务管理器需要依赖数据源信息

3 配置切入点和切面

1)在spring的配置文件中 使用<tx:advice> 配置通知信息,其实就是哪些方法需要增强,事务管理也是aop的应用

<tx:advice id=”xx” dataxxx>
        <tx:attributes>
            <tx:method name="具体的方法名"/>
        </tx:attributes>
    </tx:advice>

2)使用aop:config 来配置切入点和前面信息

aop:pointcut 配置切入点,id="" 起个名字 expression="" 配置切入点表达式

aop:advicor 配置切面 advice-ref="" pointcut-ref="" 将切入点和通知整合到一起

 

 注解方式添加事务管理@Transactional

只需要配置一个事务管理器即可 其他的都不需要

第一步:配置注解驱动事务管理,<tx:annotation-driver transaction-manager="dataSourceTransactionManager"/>

第二步: 在需要管理事务的方法或者类上面添加@Transactional注解

注意:一定要开启注解驱动 否则注解不能被识别

 

 问题:xml配置方式和注解配置方式进行事务管理 哪种用的多?

zml和注解都在使用

使用@Ttransactional注解进行事务管理,方便 不过配置太分散 使用xml进行事务管理 属性集中配置 便于管理和维护

posted @ 2022-02-14 22:43  秃头少女and战战  阅读(169)  评论(0编辑  收藏  举报