事物的隔离级别理解

有哪些锁

Read Uncommitted:读未提交

  • 事物1在读取数据时,不加任何锁
  • 事物1在修改数据时,加行级共享锁

Read Committed:读已提交

  • 事物1在读取数据时,加上行级共性锁,读取完数据后立即释放锁(不是事物结束释放锁)
  • 事务1在修改数据时,加上行级排它锁,事物结束后释放锁

Repeatable reads:可重复读

  • 事物1在读取数据时,加上行级共享锁,事物结束后释放锁
  • 事务1在修改数据时,加上行级排它锁,事物结束后释放锁

Serialiable:序列化

  • 事物1在读取数据时,加上表级共享锁,事物结束后释放锁
  • 事物1在修改数据时,加上表级排它锁,事物结束后释放锁

各个级别的隔离产生的问题和解决

Read Uncommitted:

  • 读取:在事务1在读取的时候并未对数据加锁,在事务1的生命周期里:第一次读取数据------->数据被其他事务修改------->第二次读取数据。两次读取的数据并不一致。(问题:不可重复读)
  • 修改:在事物1的生命周期里(事物还未提交,程序正在执行),“事务2”可以读取“事物1”的数据。所以事务2读取的数据并不是最终的有效数据,有可能只是程序运行过程中的临时数据(一般提交后才是最终的想要保存的数据)。(问题:脏读)

Read Committed

  • 读取:事务1在读取数据的时候,加上的共享锁,一旦读取完就会立即释放。第一次读取数据------->数据被其他事务修改------->第二次读取数据。两次读取的数据并不一致。(问题:不可重复读)
  • 修改:事物1修改过的数据,只有在事务结束后事务2才能够读取。解决了脏读的情况

Repeatable reads

  • 读取:事务1在读取数据后,事务2不可以修改,一直到事务1结束后事务2才可以修改数据。(解决了不可重复读的问题)
  • 修改:
  • 其他的问题:
  • 读取:即使加上了锁,在事务1生命周期内,表还是允许访问和修改,尽管被访问的数据不可被修改或者被访问,但是允许插入新数据,这样就导致了:事务1 查询了一批符合条件的数据,并且上锁-------->表格被插入新的数据---------->再次查询,结果不再一致。(问题:幻读)

Serialiable

扫描二维码关注公众号,回复: 2711150 查看本文章
  • 读取:很明显加上表级锁问题解决
  • 修改:很明显加上表级锁问题解决

在现实中遇到的问题举例

Read Uncommitted:

Read Committed

Repeatable reads

Serialiable

猜你喜欢

转载自blog.csdn.net/qq_38296051/article/details/81585660