数据库的隔离级别以及锁的关系的思考

前言

       1.乐观锁和悲观锁 与 数据库的隔离级别的关系 或者两者使用的场景是什么?

       我在网上所能找到的答案,帮助个人的理解。

       答案一:事务隔离级别是并发控制的整体解决方案,其实际上是综合利用各种类型的锁和行版本控制,来解决并发问题。锁是数据库并发控制的内部机制,是基础。对用户来说,只有当事务隔离级别无法解决一些并发问题和需求时,才有必要在语句中手动设置锁。

       那么事务隔离级别无法解决哪些并发问题呢?   

      先来看看事务的隔离级别:     

   事务隔离级别

   为了解决多个事务并发会引发的问题,进行并发控制。数据库系统提供了四种事务隔离级别供用户选择。

  • Read Uncommitted 读未提交:不允许第一类更新丢失。允许脏读,不隔离事务。
  • Read Committed 读已提交:不允许脏读,允许不可重复读。
  • Repeatable Read 可重复读:不允许不可重复读。但可能出现幻读。
  • Serializable 串行化:所有的增删改查串行执行。

  读未提交

 事务读不阻塞其他事务读和写,事务写阻塞其他事务写但不阻塞读。
 可以通过写操作加“持续-X锁”实现。

 读已提交

 事务读不会阻塞其他事务读和写,事务写会阻塞其他事务读和写。
 可以通过写操作加“持续-X”锁读操作加“临时-S锁”实现

可重复读

事务读会阻塞其他事务事务写但不阻塞读,事务写会阻塞其他事务读和写。
可以通过写操作加“持续-X”锁,读操作加“持续-S锁”实现。

串行化

“行级锁”做不到,需使用“表级锁”。

可串行化

如果一个并行调度的结果等价于某一个串行调度的结果,那么这个并行调度是可串行化的。

区分事务隔离级别是为了解决脏读、不可重复读和幻读三个问题的。

事务隔离级别 回滚覆盖 脏读 不可重复读 提交覆盖 幻读
读未提交 x 可能发生 可能发生 可能发生 可能发生
读已提交 x x 可能发生 可能发生 可能发生
可重复读 x x x x 可能发生
串行化 x x x x x

既然事务的隔离级别可以做到这些。还需要悲观锁干什么呢?

我的理解是:(理解有错误的,请大家指正)

Mysql默认使用的隔离级别是:可重复读

MSSQL默认使用的隔离级别是:读已提交

如果在MSSQL使用默认使用的隔离级别时读已提交的同事也想开发过程中想解决:不可重复读,提交覆盖和幻读等问题就可以使用悲观锁实现。

MYSQL同理。

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值