• 数据库事务


    前言

    事务首先是一系列操作组成的工作单元,该工作单元内的操作是不可分割的,即要么所有操作都做,要么所有操作都不做。
    
    事务必需满足ACID(原子性、一致性、隔离性和持久性)特性,缺一不可:
    	原子性(Atomicity):即事务是不可分割的最小工作单元,事务内的操作要么全做,要么全不做;
    	一致性(Consistency):在事务执行前数据库的数据处于正确的状态,而事务执行完成后数据库的数据还是处于正确的状态,即数据完整性约束没有被破坏。
    	隔离性(Isolation):并发事务执行之间无影响,在一个事务内部的操作对其他事务是不产生影响。
    	持久性(Durability):事务一旦执行成功,它对数据库的数据的改变必须是永久的,不会因比如遇到系统故障或断电造成数据不一致或丢失。
    

    多个事务并发执行的问题

    丢失更新:
    	两个事务同时更新一行数据,最后一个事务的更新会覆盖掉第一个事务的更新,从而导致第一个事务更新的数据丢失,
    	这是由于没有加锁造成的。
    
    脏读:
    	一个事务看到了另一个事务未提交的更新数据。
    
    不可重复读:
    	在同一事务中,多次读取同一数据却返回不同的结果。
    
    幻读:
    	在第一个事务开始时读取到一批数据,但此后另一个事务又插入了新数据并提交,此时第一个事务又读取这批数据但发现多了一条,
    	即好像发生幻觉一样。
    

    问题解决

    未提交读(Read Uncommitted):
    	很不安全,
    	可能出现丢失更新、脏读、不可重复读、幻读。
    
    提交读(Read Committed):
    	一个事务能读取到别的事务提交的更新数据,不能看到未提交的更新数据,
    	可能出现不可重复读、幻读;
    
    可重复读(Repeatable Read):
    	保证同一事务中先后执行的多次查询将返回同一结果,不受其他事务影响,
    	可能出现幻读;
    
    序列化(Serializable):
    	最高隔离级别,不允许事务并发执行,而必须串行化执行,最安全。
    

    Spring提供的事务管理

    Spring框架最核心功能之一就是事务管理:
    	1. 提供一致的编程式事务管理API。
    	2. 无侵入式的声明式事务支持。
    

    Spring事务隔离级别

    隔离级别是指若干个并发的事务之间的隔离程度。TransactionDefinition 接口中定义了五个表示隔离级别的常量:
    
    TransactionDefinition.ISOLATION_DEFAULT:
    	这是默认值,表示使用底层数据库的默认隔离级别。
    	对大部分数据库而言,通常这值就是TransactionDefinition.ISOLATION_READ_COMMITTED。
    
    ISOLATION_READ_UNCOMMITTED(读未提交)
    
    ISOLATION_READ_COMMITTED(读已提交)
    
    ISOLATION_REPEATABLE_READ(可重复读)
    
    ISOLATION_SERIALIZABLE(串行化)
    

    事务传播行为

    事务的传播行为是指,如果在开始当前事务之前,一个事务上下文已经存在,
    此时有若干选项可以指定一个事务性方法的执行行为。
    在TransactionDefinition定义中包括了如下几个表示传播行为的常量:
    
    TransactionDefinition.PROPAGATION_REQUIRED(默认):
    	必需有(有就不需要新建,而是加入;没有就新建)
    
    PROPAGATION_REQUIRES_NEW:
    	每次创建一个新的事务(有则挂起)
    
    PROPAGATION_SUPPORTS:
    	可有可无(有就不需要新建,而是加入)
    
    PROPAGATION_NOT_SUPPORTED:
    	不能有(有则挂起)
    
    PROPAGATION_NEVER:
    	不能用(有则异常)
    
    PROPAGATION_MANDATORY:
    	必需有(有就不需要新建,而是加入;没有就异常)
    
    PROPAGATION_NESTED:
    	有就嵌套,没有就新建。
    

    内置事务管理器与编程式事务

    DataSourceTransactionManager : org.springframework.jdbc.datasource
    
    	用于Spring JDBC抽象框架、iBATIS或MyBatis框架的事务管理。
    
    	<bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    		<property name="dataSource" ref="dataSource"/>
    	</bean>
    
    JpaTransactionManager : org.springframework.orm.jpa
    
    	用于集成JPA实现框架时的事务管理。
    
    	<bean id="txManager" class="org.springframework.orm.jpa.JpaTransactionManager">
    		<property name="entityManagerFactory" ref="entityManagerFactory"/>
    	</bean>
    

    声明式事务

    <bean id="txManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
    	<property name="dataSource" ref="dataSource"/>
    </bean>
    
    
    <tx:advice id="txAdvice" transaction-manager="txManager">
        <tx:attributes>
            <tx:method name="save*" propagation="REQUIRED" isolation="READ_COMMITTED"/>
            <tx:method name="*" propagation="REQUIRED" isolation="READ_COMMITTED" read-only="true"/>
        </tx:attributes>
    </tx:advice>
    
    
    <tx:attributes>
    	<tx:method name="……"
    			propagation=" REQUIRED"
    			isolation="READ_COMMITTED"
    			timeout="-1"
    			read-only="false"
    			no-rollback-for=""
    			rollback-for=""/>
    </tx:attributes>
    
    
    @Transactional实现事务管理:
    
    	<tx:annotation-driven transaction-manager="txManager"/>
    
    	@Transactional(propagation=Propagation.REQUIRED, isolation=Isolation.READ_COMMITTED, readOnly=true)
    

    事务总结

    https://www.cnblogs.com/loveer/p/11471022.html

    https://www.cnblogs.com/loveer/p/11471186.html

  • 相关阅读:
    base加密解密工具类
    根据银行卡号判断所属银行(部分资源网上抄录)
    input autocomplete属性设计输入框自动联想(php实现)
    XFire+Spring构建Web Service经验总结
    php学习手记(持续更新)
    ios上遇到的坑(持续更新)
    随笔
    HTML5微信长按图片不会弹出菜单的解决方法
    能在编辑器里面写出的字符
    css文本两端对齐,分散对齐
  • 原文地址:https://www.cnblogs.com/loveer/p/11819790.html
Copyright © 2020-2023  润新知