Spring基础之事务控制

 

 

一、事务的概述

  1、事务是什么

    数据库管理系统执行过程的一个逻辑单位,由有限个数据库读/写操作序列构成一个整体。

 

  2、事务的四大特性

    原子性(Atomicity):事务中的所有数据库操作要么都执行成功,要么都执行失败。

    一致性(Consistency):事务执行前后,数据都是正确的。数据库状态与业务规则保持一致。

    隔离性(Isolation):多个事务并发执行时,事务间互不干扰。

    持久性(Durability):已提交的事务对数据库数据的修改,应永久保存在数据库。

 

  3、Spring事务管理

    (1)编程式

       使用原生JDBC API进行事务管理,在核心业务代码中嵌入事务管理代码,容易造成代码冗余,增加代码间的耦合度。

    (2)声明式

       把事务管理代码从业务代码中分离,借助spring aop,在不同的事务管理api中抽象出一套事务管理机制,实现声明式事务管理。

    (3)事务管理器

        

 

二、事务的7种传播行为

     当事务方法A调用事务方法B时,会将A的事务传播给B,B对于事务的处理方式就是事务的传播行为。因此,必须在被调用者方法B指定事务的传播行为。

 

  

 

二、事务的隔离级别

  1、事务并发问题

    (1)脏读

      指一条数据中的字段

      ① Transaction01将某条记录的AGE值从20修改为30。

      ② Transaction02读取了Transaction01更新后的值:30。

      ③ Transaction01回滚,AGE值恢复到了20。

      ④ Transaction02读取到的30就是一个无效的值。

    

    (2)不可重复读

      指一条数据中的字段

      ①Transaction01读取了AGE值为20。

      ②Transaction02将AGE值修改为30。

      ③Transaction01再次读取AGE值为30,和第一次读取不一致。

 

    (3)幻读

      指一张表的数据

      ①Transaction01读取了STUDENT表中的一部分数据。

      ②Transaction02向STUDENT表中插入了新的行。

      ③Transaction01读取了STUDENT表时,多出了一些行。

 

  2、四种隔离级别

    数据库系统必须具备隔离并发运行各个事务的能力,事务间的隔离程度就称为隔离级别。级别越高,数据一致性越好,但并发性越弱。

 

  3、隔离级别解决并发问题能力表

 

脏读

不可重复读

幻读

READ UNCOMMITTED

READ COMMITTED

REPEATABLE READ

SERIALIZABLE

 

  4、数据库产品对隔离级别支持程度

 

Oracle

MySQL

READ UNCOMMITTED

×

READ COMMITTED

√(默认)

REPEATABLE READ

×

√(默认)

SERIALIZABLE

 

 

三、怎么进行事务控制

  1、xml方式

 示例:

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
       xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
       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/tx
        http://www.springframework.org/schema/tx/spring-tx.xsd
        http://www.springframework.org/schema/aop
        http://www.springframework.org/schema/aop/spring-aop.xsd">
    
    <!-- 1、配置数据源-->
    <bean id="dataSource" class="org.springframework.jdbc.datasource.DriverManagerDataSource">
        <!--此处省略具体配置-->
    </bean>
    
    <!-- 2、配置事务管理器 -->
    <bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
        <property name="dataSource" ref="dataSource"></property>
    </bean>

    <!-- 3、配置事务的通知-->
    <tx:advice id="txAdvice" transaction-manager="transactionManager">
        <tx:attributes>
            <tx:method name="*" propagation="REQUIRED" read-only="false"/>
            <tx:method name="find*" propagation="SUPPORTS" read-only="true"></tx:method>
        </tx:attributes>
    </tx:advice>

    <!-- 4、配置aop-->
    <aop:config>
        <aop:pointcut id="pt1" expression="execution(* com.demo.service.impl.*.*(..))"></aop:pointcut>
        <aop:advisor advice-ref="txAdvice" pointcut-ref="pt1"></aop:advisor>
    </aop:config>
</beans>

 

  2、全注解方式

@Configuration
@EnableTransactionManagement    //开启注解事务
public class SpringTxConfiguration {
    //里面配置数据源,配置 JdbcTemplate,配置事务管理器等
}

 

 

 

 

 

 

 

posted @ 2020-05-28 16:18  玉壶冰  阅读(276)  评论(0编辑  收藏  举报