Spring学习(十):Spring事务管理—数据库事务管理知识 - Go语言中文社区

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以保证数据的读一致性

 

 

版权声明:本文来源CSDN,感谢博主原创文章,遵循 CC 4.0 by-sa 版权协议,转载请附上原文出处链接和本声明。
原文链接:https://blog.csdn.net/StringBuff/article/details/102771683
站方申明:本站部分内容来自社区用户分享,若涉及侵权,请联系站方删除。
  • 发表于 2020-03-07 15:14:40
  • 阅读 ( 836 )
  • 分类:数据库

0 条评论

请先 登录 后评论

官方社群

GO教程

猜你喜欢