Spring支持的常用数据库事务传播属性和隔离级别 完整版(面试必看)

事务的四大特征

1.原子性:一个事务中所有对数据库的操作是一个不可分割的操作序列,要么全做要么全不做

2.一致性:数据不会因为事务的执行而遭到破坏

3.隔离性:一个事物的执行,不受其他事务的干扰,即并发执行的事物之间互不干扰

4.持久性:一个事物一旦提交,它对数据库的改变就是永久的

事务属性

    1.propagation:用来设置事务传播行为

        事务传播行为:一个方法运行在一个开启了事务的方法中时,当前方法是使用原来的事务还是开启一个新的事务

        Propagation.REQUIRED: 默认值 使用原来的事务 

        Propagation.REQUIRES_NEW: 将原来的事务挂起 开启一个新的事务

    2.isolation: 用来设置事务的隔离级别

        Isolation.REPEATABLE_READ: 可重复读 MySQL默认隔离级别

        Isolation.READ_COMMITTED: 读已提交 Oracle默认隔离级别 开发时通常使用的隔离级别

 

Spring 有7种事务传播行为

 

事务行为

说明

PROPAGATION_REQUIRED

支持当前事务,假设当前没有事务。就新建一个事务

PROPAGATION_SUPPORTS

支持当前事务,假设当前没有事务,就以非事务方式运行

PROPAGATION_MANDATORY

支持当前事务,假设当前没有事务,就抛出异常

PROPAGATION_REQUIRES_NEW

新建事务,假设当前存在事务。把当前事务挂起

PROPAGATION_NOT_SUPPORTED

以非事务方式运行操作。假设当前存在事务,就把当前事务挂起

PROPAGATION_NEVER

以非事务方式运行,假设当前存在事务,则抛出异常

PROPAGATION_NESTED

如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。

 

数据库并发事务引起的问题以及如何避免

1.更新丢失——mysql所有事务隔离级别在数据库层面均可避免。 

        例: 一个事务的更新覆盖了另一个事务的更新。事务A:向银行卡存钱100元。事务B:向银行卡存钱200元。A和B同时读到银行卡的余额,分别更新余额,后提交的事务B覆盖了事务A的更新。更新丢失本质上是写操作的冲突,解决办法是一个一个地写。

 

2.脏读——READ-COMMITTED事务隔离级别以上可以避免。(未提交的事务修改的数据也能读取到而引起的错误数据,RC级别以上可避免)

           例: 一个事务读取了另一个事务未提交的数据。事务A:张三妻子给张三转账100元。事务B:张三查询余额。事务A转账后(还未提交),事务B查询多了100元。事务A由于某种问题,比如超时,进行回滚。事务B查询到的数据是假数据。脏读本质上是读写操作的冲突,解决办法是写完之后再读。

 

3.不可重复读——REPETABLE-READ事务隔离级别以上可避免。(加锁后读取的数据会因为其他事务操作而变化,RR级别以上可避免)

        例: 一个事务两次读取同一个数据,两次读取的数据不一致。事务A:张三妻子给张三转账100元。事务B:张三两次查询余额。事务B第一次查询余额,事务A还没有转账,第二次查询余额,事务A已经转账了,导致一个事务中,两次读取同一个数据,读取的数据不一致。不可重复读本质上是读写操作的冲突,解决办法是读完再写。

 

4.幻读——SERIALIZABLE事务隔离级别可避免。

        例: 一个事务两次读取一个范围的记录,两次读取的记录数不一致。事务A:张三妻子两次查询张三有几张银行卡。事务B:张三新办一张银行卡。事务A第一次查询银行卡数的时候,张三还没有新办银行卡,第二次查询银行卡数的时候,张三已经新办了一张银行卡,导致两次读取的银行卡数不一样。幻象读本质上是读写操作的冲突,解决办法是读完再写。

 

 

事务隔离级别

  事务隔离级别指的是多个并发事务之间的隔离程度

  1)  ISOLATION_DEFAULT

    此种隔离级别是事务管理默认配置的,使用数据库的默认隔离级别,上面的配置中就是使用此种级别,下面的四种级别与jdbc的相对应。

  2)  ISOLATION_READ_UNCOMMITTED

    未提交读。允许其他事务可以看到本事务未提交的数据,可造成脏读、幻读和不可重复读

  3)  ISOLATION_READ_COMMITTED

    提交读。其他事务只能读取到本事务提交后的数据,本事务不提交,其他事务无法读取到本事务数据,可防止脏读,可能出现幻读和不可重复读

  4)  ISOLATION_REPEATABLE_READ

    可重复读。保证事务不提交就不会读取到其数据,防止脏读和不可重复读,可能发生幻读。 (MySQL默认隔离级别)

  5)  ISOLATION_SERIALIZABLE

    可串行化。牺牲效率顺序执行事物,如果事物执行异常,其他事务阻塞。防止脏读,幻读和不可重复。

 

SQL支持的事务隔离级别

隔离级别

脏读

不可重复读

幻读

READ UNCOMMITTED

可能

可能

可能

READ COMMITTED

不可能

可能

可能

REPEATABLE READ

不可能

不可能

可能

SERIALIZABLE

不可能

不可能

不可能

 

各种数据库支持的事务隔离级别

事务隔离级别

Oracle

MySQl

READ UNCOMMITTED

×

READ COMMITTED

√(默认隔离级别)

REPEATABLE READ

×

√(默认隔离级别)

SERIALIZABLE

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值