晓夏

北漂的女孩

Good Luck To You!

数据库:事务隔离级别,grap锁

浏览量:395

  1. 数据库的特性

  • 原子性:事务内,处理数据要么全部成功,要么全部失败

  • 一致性:处理数据前和后,都是一致;例子:假设A和B的钱加起来是5000,不管A和B之间如何转账,转几次账,事务结束钱相加起来应该还得是5000,这就是事务的一致性。

  • 持久化:一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作

  • 隔离性:多个用户并发访问数据库时,操作同一张表时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。

B.事务的隔离性产生的几种问题

    1)、脏读

    数据在处理的过程中,查询了未提交的事务的数据。

    例子:

       图片.png

    出现上述情况,即我们所说的脏读 ,两个并发的事务,“事务A:转账”、“事务B:取钱”,事务B读取了事务A尚未提交的数据。

    解决方案:

    如果事务在更新和插入的时候不允许别人去查询,就避免这个事情发生

    2)、不可重复读

    事务a读取数据库中的数据后,事务b更新了该数据,当事务a再次读取该数据时,就会发现数据已经发生了改变

    例子:

    一个编辑人员两次读取同一文档,但在两次读取之间,作者重写了该文档。当编辑人员第二次读取文档时,文档已更改。原始读取不可重复。

    解决方案:

    如果只有在作者全部完成编写后编辑人员才可以读取文档,则可以避免该问题。

    3)、幻读

    事务非独立执行时发生的一种现象。

    例子:

    图片.png

    A事务读取B事务提交的新增数据,会引发幻读问题。幻读一般发生在计算统计数据的事务中。

    4)、第一类更新丢失

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

    例子:

    图片.png

    这时候取款事务A撤销事务,余额恢复为1000,这就丢失了更新。

    2)、第二类数据更新丢失

    图片.png

    为了解决上述问题,数据库通过锁机制解决并发访问的问题。根据锁定对象不同:分为行级锁表级锁;根据并发事务锁定的关系上看:分为共享锁定独占锁定

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

    但是直接使用锁机制管理是很复杂的,基于锁机制,数据库给用户提供了不同的事务隔离级别,只要设置了事务隔离级别,数据库就会分析事务中的sql语句然后自动选择合适的锁。

        共享锁定:会防止独占锁定但允许其他的共享锁定。

        独占锁定:既防止共享锁定也防止其他独占锁定。


C.事务的隔离级别  

    级别1:读取未提交(Read uncommitted),这种并发性最高,但会导致上述问题

    级别2:读取已提交(Read committed),这是oracle的默认隔离级别

    级别3:可重复读(Repeatable read)

    级别4:串行(Serializable),这种隔离级别最高,但数据库并发会受到很大的限制,可以避免上述问题,但项目中不会采用

    图片.png





















神回复

发表评论:

◎欢迎参与讨论,请在这里发表您的看法、交流您的观点。