Spring学习(十):Spring事务管理—数据库事务管理知识

一、数据库事务

  • 原子性:表示组成一个事务的多个数据库操作,是一个不可分割的原子单元,只有所有的操作执行成功 ,事务才会提交
  • 一致性:事务操作成功后,数据库所处的状态和他的业务规则是一致的
  • 隔离性:在并发数据操作时,不同的事务拥有各自的操作空间
  • 持久性:事务提交成功后,数据库的数据操作都必须持久化到数据库中

数据的一致性是最终目标。

数据库锁:多个事务试图对相同的数据进行操作时,只有持有锁的事务才可以操作数据

二、数据并发的问题:

1.脏读:A事务读取B事务尚未提交的更改数据,并在这个数据的基础上进行操作。如果恰巧B事务回滚,那么A事务读取的数据根本是不会被承认的。

2.不可重复读:指在一个事务内,多次读同一数据。在这个事务还没有结束时,另外一个事务也访问该同一数据。那么,在第一个事务中的两次读数据之间,由于第二个事务的修改,那么第一个事务两次读到的的数据可能是不一样的。这样就发生了在一个事务内两次读到的数据是不一样的,因此称为是不可重复读..

3.幻象读:

幻象读和不可重复读是两个 容易混淆的概念。

  • 幻象读是读取到了其他已经提交事物的新增数据(insert),添加表级锁,将整张表锁定,防止新增数据(Oracle使用多版本数据方式实现)
  • 不可重复读是读取到了其他已经提交事务的修改数据(update、delete)。添加行级锁

4.第一类丢失更新

A事务撤销时,把已经提交的B事务更新数据覆盖了。

5.第二类丢失更新

A事务覆盖B事务已经提交的数据,造成B事务所作操作丢失。

三、数据库锁机制

按锁定的对象不同,一般可以分为表级锁行级锁。从并发事务锁定的关系看,可以分为共享锁定 和独占锁定。

  • 共享锁定会防止独占锁定,但允许其他共享锁定
  • 独占锁定即防止其他独占锁定,也防止共享锁定

为了修改数据,数据库必须在被修改的行上施加行独占锁定,insert、update、delete、select for update语句都会隐式采用必要的行锁定。

Oracle数据库五种常用的行锁定:

  1. 行共享锁定:通过select for update 语句隐式获取,在Oracle中用户可通过LOCK TABLE IN ROW SHARE MODE语句显示获得。行共享锁定不防止对数据行进行修改操作,但是防止其他会话获取独占性表锁定。允许进行多个并发的行共享和 行独占锁定
  2. 行独占锁定:通过一条INSERT UPDATE 或DELETE隐式获取,还可通过LOCK TABLE IN ROW EXCLUSIVE MODE显式获取。这种锁定可防止其他会话获取一个共享锁定,共享行独占锁定和独占锁定
  3. 表共享锁定:
  4. 表共享行独占锁定:
  5. 表独占锁定:

四、事务的隔离级别

数据库事务隔离级别

隔离级别

 

脏读不可重复读幻象读第一类丢失更新第二类丢失更新
READ UNCOMMITED允许允许不允许不允许允许
READ COMMITED不允许允许允许不允许允许
REPEATABLE READ不允许不允许允许不允许不允许
SERIALIZABLE不允许不允许不允许不允许不允许

数据库的隔离级别和数据的并发性是对立的。

  • 使用READ UNCOMMITED 隔离级别的数据库拥有最高的并发量和吞吐性
  • 使用SERIALIZABLE隔离级别的数据库并发性最低
  • SQL 92推荐使用REPEATABLE READ以保证数据的读一致性

 

 

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值