• MySQL数据库事务属性与隔离级别


      参考文章

      https://blog.csdn.net/qq_35206244/article/details/82493215
      https://www.cnblogs.com/wyaokai/p/10921323.html

      1、事务属性

      原子性(Atomicity):
      事务内的操作要么都执行、要么都不执行。不可分割。

      一致性(Consistency):
      数据库在事务执行前后都处于一致性状态,从一个一致性状态转换为另一个一致性状态。完整性约束没有被破坏。
      原子性、隔离性、持久性都为了一致性,是目的。

      隔离性(Isolation):
      多个事务之间相互隔离运行,互不打扰,不能同一时间请求同一数据,要么在前、要么在后。提供了4中隔离级别。

      持久性(Durability):
      事务一旦提交就是永久性的,断电后也会存在数据库中。

      2、不考虑事务的隔离性,出现的问题

      脏读:一个线程中的事务读到了另一个线程中事务尚未提交的数据。(可能读到回滚的数据)
      解决方法:禁止读取未提交的事务。

      不可重复读:一个事务内两次读到的数据不一样。(两次读之间有别的事务修改且提交了数据,针对修改记录操作)
      解决办法:一个事务读的时候,禁止任何事务写。记录上加写锁。

      幻读:一个事务内两次读到的数据不一样。(两次读之间有别的事务新增且提交了数据,针对表的新增记录操作)
      解决办法:加全局写锁,即表上加锁。

      3、事务隔离级别

      读未提交(Read-uncommitted):可能出现脏读、不可重复读、幻读。
      读已提交(Read committed):可能出现不可重复读、幻读。解决了脏读问题。
      可重复读(Repeatable read):可能出现幻读。
      串行化(Serializable ):都不可能出现。

      4、设置事务的隔离级别

      1)可设置级别xxxx:

      read uncommitted
      read committed
      repeatable read
      serializable

      2)查询事务的隔离级别:(默认级别是可重复读)

      select @@tx_isolation;
      select @@session.tx_isolation;
      select @@global.tx_isolation;

      

      3)设置事务的隔离级别

      设置下一次事务的隔离级别,下一次事务提交自动失效
      set transaction isolation level xxxx

      设置当前会话的隔离级别,会话结束自动失效
      set session transaction isolation level xxxx

      设置全部会话的隔离级别,不影响本次和已经连接的会话,作用于新打开的会话
      set global transaction isolation level xxxx

      备注

      在当前窗口中设置global级别:
      查询@@tx_isolation和@@session.tx_isolation不会生效,只有@@global.tx_isolation生效

      在当前窗口中设置session级别:
      查询@@global.tx_isolation不会生效,@@session.tx_isolation、@@tx_isolation生效

      在当前窗口中设置transaction级别:
      查询@@global.tx_isolation、@@session.tx_isolation、@@tx_isolation都不生效

      在当前窗口中设置global级别:
      重新打开的窗口,查询@@tx_isolation和@@session.tx_isolation、@@global.tx_isolation都生效

      重新启动数据库,设置的global级别失效,恢复为默认的 repeatable read

      

      

  • 相关阅读:
    GO学习-(17) Go语言基础之反射
    Go语言基础之time包
    Go语言标准库log介绍
    GO学习-(16) Go语言基础之文件操作
    GO学习-(15) Go语言基础之包
    GO学习-(14) Go语言基础之接口
    五种开源API网关实现组件对比
    Spring Junit4 Test
    Java泛型
    SQL 基本(Head First)
  • 原文地址:https://www.cnblogs.com/javasl/p/13289587.html
Copyright © 2020-2023  润新知