隔离性是针对数据资源的并发访问,规定了 各个事务之间相互影响的程度 。
举例:为了疫情防控,各个城市针对于每个人的出行情况,出了对应的隔离级别,例如低风险的回老家就是3天两检,中风险的就是隔离14天,特别严重的就是集中隔离21天,等等 。。。
隔离级别就是为了防止出现问题,而定的规则!
而事务的隔离性也分为了4种类型的隔离级别,这些隔离级别专门用于应对 数据资源并发访问 下不同问题的场景 。(就好比上面的例子,每个隔离级别都是对应一个场景,三天两检就是对应的低风险) 。
1、并发事务下会产生什么问题?什么是并发事务?并发事务就是多个客户端同时开启事务,或者是多个会话同时开启事务!Java当中一个接口就是一个事务,也可以称之为一次会话,接口当中包含了很多sql,当并发访问接口的时候会出现什么问题,也被称为并发事务问题 。当然本篇主要以数据库并发事务产生的问题为主!
隔离级别专门用于应对 数据资源并发访问 下不同问题的场景,那么究竟有哪些问题呢?有三个:脏读、不可重复读、幻读
- 脏读: 读到了还没有提交事务的数据,简称读未提交
文章插图
- 不可重复读: 同一个事务在事务过程中,对同一个数据进行读取操作,读取到的结果不同 。
文章插图
- 幻读: 一个事务按照条件查询数据时,没有对应的数据行,但是在插入数据时,又发现这行数据已经存在,好像出现了 “幻影” 。
文章插图
不可重复读侧重表达 读-读,幻读则是说 读-写,用写来证实读的是鬼影 。
如何避免:
- 要避免脏读,需要控制在事务没有提交更新前,其他事务无法看到此事务的更新结果 。
- 要避免不可重复读,假如查询单条数据,可以通过行锁,范围查询可以进行表锁 。
- 要避免幻读,需要将整张表都锁住了 。
文章插图
- 读未提交(Read Uncommitted): 最低的隔离级别 。一个事务可以读取另一个事务没有提交的更新结果 。它是性能最好,也可以说它是最野蛮的方式,因为它压根儿就不加锁,所以根本谈不上什么隔离效果,可以理解为没有隔离 。
- 读已提交(Read Committed): 一个事务的更新操作只有在提交了之后,才会被另一个事务读取到同一笔数据更新后的结果 。
- 可重复读(Repeatable Read): 在整个事务中,对同一笔数据的读取结果是相同的,不管其他事务是否同时在对这笔数据进行更新,也不管这笔更新是否提交 。
- 串行化(SERIALIZABLE): 串行化就相当于处理一个人请求的时候,别的人都等着 。读的时候加共享锁,也就是其他事务可以并发读,但是不能写 。写的时候加排它锁,其他事务不能并发写也不能并发读 。
推荐阅读
- mysql服务如何查看是否启动?
- 谷歌Messages应用中的“Swipe actions“现在可以定制了
- Spring事务失效的各种场景
- 中国六大最美不夜城
- 原来,中国驾照才是“最牛国际”驾照
- 公司的常见内耗:陷于各种内耗之中,难怪发展不起来
- 这8种错误跑姿跑者经常中招,都存在哪些危害?
- 大量走路影响着床吗
- 降血压的纳豆激酶和纳豆是什么关系 中奇纳豆激酶
- 纪传体通史的代表作是哪部? 中国第一部纪传体通史是什么?