zoukankan      html  css  js  c++  java
  • spring的事务处理

    说到事务,无非就是事务的提交commit和回滚rollback。

    事务是一个操作序列,这些操作要么全部都执行成功,事务去提交,要么就是有一个操作失败,事务去回滚。

    要知道事务的4大特性ACID.即原子,一致,隔离,持久。

    原子性(atomicity):一个事务是一个不可分割的工作单位,事务中的诸多操作,要么都做,要么都不做。

    一致性(consistency):事务必须使数据库从一个一致性状态,转变为另一个一致性状态。一致性和原子性是密切相关的。

    隔离性:(isolation)一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务不能互相干扰。 

    持久性(durability):持续性也称永久性,指一个事务一旦提交,他对数据库中的数据的改变就应该是永久性的。接下来的其他操作或故障不应该对齐有任何影响。


    手动设置事务

    try{
    开启事务
    操作1--》db操作
    操作2--》db操作
    操作3--》db操作
    提交事务
    }catch{
    回滚事务
    }


    下面用ssm框架来管理事务


    1首先配置事务管理器


    关键类是DataSourceTransactionManager。

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">

    <property name="dataSource" ref="dataSource"/>(表示管理哪个数据源的事务)

    </bean>


    2声明事务的特性、规则(注解方式不用配置事务特性)


    <!--通过<tx:advice>标签定义事务增强,并制定事务管理器 -->

    <tx:advice id="txAdvice" transaction-manager="txManager">(给带有create前缀的方法规定事务特性)

    <!--定义属性,声明事务规则 -->

    <tx:attributes>

    <tx:method name="create*" propagation="REQUIRED" isolation="DEFAULT" rollback-for="Exception"/>

    </tx:attributes>

    </tx:advice>


     

    分析下事务的propagation传播方式

    分析下事务的isolation

    隔离性
    对相同的数据进行读写时,事务并发会发生错误数据处理,会产生脏读、幻读,不可重复读等错误,这些可以通过设置事务的隔离级别来解决
    脏读:一个事务读取了另一个事务改写但还未提交的数据,如果这些数据被回滚,则读到的数据时无效的
    不可重复读:在同一事务中,多次读取同一数据返回的结果不同,换句话说,后续读取可以读到另一事务已提交的更新数据,这样就会出现两次读取数据不一样(如事务t1读取某一数据,事务t2读取并修改了该数据,t1为了读取值惊醒校验而在此读取改数据,得到了不同的结果)
    可重复读:在同一事务中多次读取数据时,能够保证所读数据一样,也就是后续读取不能读到另一事务已经提交更新的数据
    幻读:一个事务读取了几行记录后,另一事务插入一些记录,幻读就发生了,再后来的查询中,第一个事务就会发现原来没有的记录

    隔离级别(isolation):
    1、读未提交 READ_UNCOMMITTED 还未提交就能查看(read_uncommitted)
    2、读已提交 READ_COMMITTED 这个级别会把查看,增删改隔离开来,未提交的增删改不能查看(read_committed)
    3、可重复读REPEATABLE_READ(read)
    4、序列化操作SERIALIZABLE 事务间对同一数据互斥,必须等第一个事物完成之后,第二个事务才可以操作(serializable)
    默认值 DEFAULT(oracle 默认值是第二个,mysql是第三个)(default)
    隔离级别由低到高的顺序 READ_UNCOMMITTED -->READ_COMMITTED-->REPEATABLE_READ-->SERIALIZABLE级别越高安全性越高,并发处理能力越低

    分析下事务的rollback-for

    是事务回滚方式一般异常时回滚Exception


    3配置事务


    3.1使用注解来配置


    <!-- 开启事务注解,标注@Transactional的类和方法将具有事务性 -->

    <tx:annotation-driven transaction-manager="txManager" />(使用哪个事务管理器来配置事务)

    注解的用法,必须为public方法才行,不要捕捉异常,要让异常自动抛出,否则不能进行事务回滚。方法要写在服务层中在controller中无效。

    @Transactional(isolation=isolation.READ_COMMITED)
    public void f3(){
    处理1
    处理2
    }


    3.2使用标签来配置(注解方式不用配置事务特性)


    <!-- 在切面中插入事务 -->

    <aop:config proxy-target-class="true">

    事务代理(代理归属权)
    创建的sqlsesstion用什么接收的问题?
    proxy-target-class=false
    jdk的代理(只能用impl,不能用接口)
    proxy-target-class=true
    spring的代理(可以用接口了)

    <aop:pointcut id="serviceMethod" expression="execution(* com.lyt.soa.service..*.*(..))"/>(在哪些切点中加入事务)

    <!-- 将事务增强与切入点组合(织入事务切面) -->

    <aop:advisor pointcut-ref="serviceMethod" advice-ref="txAdvice"/>(织入事务并规定了事务特性)

    </aop:config>


     

    学习使我快乐! 一起成长
  • 相关阅读:
    jenkins(3): jenkins执行shell命令
    jenkins(2): jenkins定时构建项目
    jenkins(1): jenkins安装以及从gitlab拉取代码
    gitlab之一: gitlab安装配置使用
    playbook role应用
    Spark(一)—— 大数据处理入门
    Kafka(二) —— Server端设计原理
    Kafka(一) —— 基本概念及使用
    LeetCode 第 159 场周赛
    LeetCode 第 155 场周赛
  • 原文地址:https://www.cnblogs.com/zhizhuoDEZHUZHU/p/9612920.html
Copyright © 2011-2022 走看看