关系型数据库的隔离级别

  • 脏读

    一事务对记录做了增删改操作,还未提交,另外一个事务产生读操作。此时第一个事务发生回滚,导致第二个事务产生脏读。

  • 不可重复读

    事务中发生两次读取同一条记录操作,第一次读取和第二次读取之间,另一个事务对该记录修改了,则两次读取记录不一样。

  • 幻读
    第一个事务对一定范围内的批量记录做了修改,第二个事务此时对该范围增加了一条数据,导致第一个数据批量修改没有完全修改。

  • 数据库的隔离级别
    这里写图片描述

总结:
隔离级别越高,越能保证数据的完整性和一致性,但是对并发性能的影响也越大。
大多数的数据库默认隔离级别为 Read Commited,比如 SqlServer、Oracle
少数数据库默认隔离级别为:Repeatable Read 比如: MySQL InnoDB

  • Spring事务的隔离级别

    isolation_default:默认的隔离级别,使用数据库默认的事务隔离级别。另外四个与 JDBC 的隔离级别相对应
    isolation_read_uncommitted:这是事务最低的隔离级别,它充许另外一个事务可以看到这个事务未提交的数据。这种隔离级别会产生脏读,不可重复读和幻像读。
    isolation_read_committed:保证一个事务修改的数据提交后才能被另外一个事务读取。另外一个事务不能读取该事务未提交的数据
    isolation_repeatable_read:这种事务隔离级别可以防止脏读,不可重复读。但是可能出现幻像读
    isolation_serializable:这是花费最高代价但是最可靠的事务隔离级别。事务被处理为顺序执行

  • Spring事务传播机制
    required:如果存在一个事务,则支持当前事务。如果没有事务则开启一个新的事务
    mandatory:支持当前事务,如果当前没有事务,就抛出异常
    never:以非事务方式执行,如果当前存在事务,则抛出异常
    not_supported:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起
    requires:新建事务,如果当前存在事务,把当前事务挂起
    supports:支持当前事务,如果当前没有事务,就以非事务方式执行。
    nested:外层事务嵌套内层事务,外层事务异常会回滚内层事务,内层事务失败不会影响外层事务。
    PROPAGATION_NESTED 与PROPAGATION_REQUIRES_NEW:它们非常 类似,都像一个嵌套事务,如果不存在一个活动的事务,都会开启一个新的事务。使用PROPAGATION_REQUIRES_NEW时,内层事务与外层事务就像两个独立的事务一样,一旦内层事务进行了提交后,外层事务不能对其进行回滚。两个事务互不影响。两个事务不是一个真正的嵌套事务。同时它需要JTA 事务管理器的支持。
    使用PROPAGATION_NESTED时,外层事务的回滚可以引起内层事务的回滚。而内层事务的异常并不会导致外层事务的回滚,它是一个真正的嵌套事务。

  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值