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

Posted 明月之诗

tags:

篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了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

  

  

 

以上是关于MySQL数据库事务属性与隔离级别的主要内容,如果未能解决你的问题,请参考以下文章

深入理解Mysql事务隔离级别与锁机制

Spring支持的常用数据库事务传播属性和隔离级别

浅谈MySQL的事务隔离级别

谈谈MySQL的事务隔离级别

如何更改mysql事务隔离级别

mysql 的事务隔离级别 及各个隔离级别应用场景,详细