zoukankan      html  css  js  c++  java
  • Spring事务控制

    1、关键点

    1、Spring数据访问基于JDBC的API

    注册驱动
    获取连接
    创建语句集
    获取结果集

    2、注册驱动,采用的抽象工厂的方式

    3、事务管理器

    事务管理器管理的为DataSource数据源
    DataSource对Connection使用包装器模式,DataSource是对Connection的包装。
    事务管理器从DataSource中获取Con,将Con的提交方式设置AutoCommit为false,通过Con控制事务提交或回滚。
    ConnectionImpl最终操作的是Socket

    4、SQL在数据库引擎的操作

    增、删、改 操作的是对应表的临时表(在内存),如果有主键冲突、外键冲突等其他异常,会导致结果直接从临时表返回,不进行插入。
    Commit操作的是将临时表的数据真正插入数据表。

    5、数据库的隔离级别

    read-uncommited 脏读、不可重复读、幻读
    read-commited 避免脏读,会导致不可重复读、幻读
    repeatable read 避免脏读、不可重复读,会导致幻读 ,使用 MMVC机制 实现可重复读

    可重复读可以通过手动加锁,避免幻读。

    RR级别下只要对 SELECT 操作也手动加行(X)锁即可类似 SERIALIZABLE 级别(它会对 SELECT 隐式加锁),即大家熟知的:
    这里需要用 X锁, 用 LOCK IN SHARE MODE 拿到 S锁 后我们没办法做 写操作
    SELECT id FROM users WHERE id = 1 FOR UPDATE;
    如果 id = 1 的记录存在则会被加行(X)锁,如果不存在,则会加 next-lock key / gap 锁(范围行锁),即记录存在与否,mysql 都会对记录应该对应的索引加锁,其他事务是无法再获得做操作的。
    这里我们就展示下 id = 1 的记录不存在的场景,FOR UPDATE 也会对此 “记录” 加锁,要明白,InnoDB 的行锁(gap锁是范围行锁,一样的)锁定的是记录所对应的索引,且聚簇索引同记录是直接关系在一起的。

    serializable 避免脏读、不可重复度、幻读

    脏读:读到了未提交的数据,称之为脏读

    不可重复读:在两次事务中,读到的数据不一致,称之为不可重复读

    幻读:在两次事务中,首次事务对一定范围内的数据进行更改,另一事务在同一范围内插入了数据,导致首次事务查询的状态不在可以维护接下来的业务操作。

    一次select是读取,第二次的 insert 其实也属于隐式的读取,只不过是在 mysql 的机制中读取的,插入数据也是要先读取一下有没有主键冲突才能决定是否执行插入。
    不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影。

    6、事务的传播属性

    required
    new
    not supported
    never

    2、分布式事务

    分布式事务特性:CAP
    Consistence 一致性
    Avaliable 可用性
    Partition Tolerance 分区容错性

    事务通过日志异步实现

  • 相关阅读:
    缓存
    vue 生命周期:
    mongodb 数据库 增删改查
    微信小程序左右分类滚动列表
    4月29日记
    什么是MVVM
    什么是mvc
    React路由
    TodoList案例
    React中兄弟组件传值
  • 原文地址:https://www.cnblogs.com/nangonghui/p/12917252.html
Copyright © 2011-2022 走看看