• Spring事务管理-传播行为-隔离级别


    事务是逻辑上的一组操作,这组操作要么全部成功,要么全部失败。

    事务的特性:ACID

    原子性:事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

    一致性:事务前后数据的完整性约束保持一致

    隔离性:多个用户并发访问数据库时,一个用户的事务不会被其他用户的事务干扰,数据相互隔离

    持久性:事务提交之后对数据的改变是永久性的

    Spring支持两种事务管理:

    1、编程式事务管理:自己编写事务处理的类,进行调用

    Spring 对事物的编程式管理有基于底层 API 的编程式管理和基于 TransactionTemplate 的编程式事务管理两种方式。

    2、声明式事务管理(基于AOP思想实现)

    基于TransactionProxyFactoryBean的方式

    基于AspectJ的XML的方式

    基于注解方式(常用)@Transactional

    Spring编程式事务管理的三个主要接口:

    PlatformTransactionManager(事务管理器)

    TransactionDefinition(事务定义信息:传播行为、隔离级别、超时、只读)

    TransactionStatus事务具体运行状态

    根据不同的平台选择相应的事务管理器(如JDBC选择DataSourceManager)

    脏读:读到其他事务修改数据后未提交的值

    不可重复读(在于更新和删除)

    幻读(在于插入)

    事务的传播行为:解决业务层方法之间的相互调用问题

    简洁秒速:

    其中spring七个事物传播属性:
     PROPAGATION_REQUIRED -- 支持当前事务,如果当前没有事务,就新建一个事务。这是最常见的选择。
     PROPAGATION_SUPPORTS -- 支持当前事务,如果当前没有事务,就以非事务方式执行。
     PROPAGATION_MANDATORY -- 支持当前事务,如果当前没有事务,就抛出异常。
     PROPAGATION_REQUIRES_NEW -- 新建事务,如果当前存在事务,把当前事务挂起。
     PROPAGATION_NOT_SUPPORTED -- 以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
     PROPAGATION_NEVER -- 以非事务方式执行,如果当前存在事务,则抛出异常。
     PROPAGATION_NESTED -- 如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,

    则进行与PROPAGATION_REQUIRED类似的操作。 



    事务超时

    为了使应用程序很好地运行,事务不能运行太长的时间。因为事务可能涉及对后端数据库的锁定,所以长时间的事务会不必要的占用数据库资源。事务超时就是事务的一个定时器,在特定时间内事务如果没有执行完毕,那么就会自动回滚,而不是一直等待其结束。

    隔离级别

    五个隔离级别:
    ISOLATION_DEFAULT 这是一个PlatfromTransactionManager默认的隔离级别,使用数据库默认的事务隔离级别.
    另外四个与JDBC的隔离级别相对应;
    ISOLATION_READ_UNCOMMITTED 这是事务最低的隔离级别,它充许别外一个事务可以看到这个事务未提交的数据。
    这种隔离级别会产生脏读,不可重复读和幻像读。

    ISOLATION_READ_COMMITTED 保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取
    该事务未提交的数据。这种事务隔离级别可以避免脏读出现,但是可能会出现不可重复读和幻像读。

    ISOLATION_REPEATABLE_READ 这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读。它除了保证
    一个事务不能读取另一个事务未提交的数据外,还保证了避免下面的情况产生(不可重复读)。

    ISOLATION_SERIALIZABLE 这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行。除了防止脏读,
    不可重复读外,还避免了幻像读。

    关键词:
    1)幻读:事务1读取记录时事务2增加了记录并提交,事务1再次读取时可以看到事务2新增的记录;
    2)不可重复读取:事务1读取记录时,事务2更新了记录并提交,事务1再次读取时可以看到事务2修改后的记录;
    3)脏读:事务1更新了记录,但没有提交,事务2读取了更新后的行,然后事务T1回滚,现在T2读取无效。

  • 相关阅读:
    Twitter网站架构学习笔记
    优化和架构之服务切分
    现代浏览器的工作原理
    可伸缩性原则
    图解:2013年百度搜索引擎工作原理
    构建的可伸缩性和达到的性能:一个虚拟座谈会
    提升可伸缩性的8项最佳实践
    Oracle odbc配置
    Oracle Error
    java与java web数组括号的不同
  • 原文地址:https://www.cnblogs.com/cn-chy-com/p/10798604.html
Copyright © 2020-2023  润新知