mysql事务的隔离级别

mysql事务的隔离级别

查看当前数据库的隔离级别:
select @@tx_isolation;
  • 默认的隔离级别为:可重复度(REPEATABLE-READ)
设置当前会话的隔离级别:
set tx_isolation='<隔离级别>'

读未提交----read-uncommitted

当多个会话同时操作同一张表,其中某一个会话M尝试去读取表中的数据时,它会直接读取到其他会话开启事务后对表的内容造成修改后的但事务尚未提交的内容。当事务发生回滚,会话M再去查询,会出现与此之前不同的数据,造成脏读。

  • 会话A开启事务,往表中修改了数据,但事务还未结束。此时会话B想要查询这个表的数据,查到的内容是刚刚会话A修改后的内容。若会话A在会话B刚刚查询之后选择回滚了事务,会话B再去查询,会跟之前查询到的内容不一样。

读已提交----read-committed

跟上面的读未提交的相反,当前的会话只会读到其他会话结束后的表数据,无论其他会话在自己的事务中做了啥修改,只要为结束当前的会话,其他的会话都无法读取到会话未结束前的修改。

可重复读----repeatable-read

会话M开始事务去查询的同时,其他多个会话在对会话M查询的内容做修改,无论其他会话结束与否,会话M的事务只要没有结束,会话M去查询的内容始终与会话M开启事务时查询到的内容一致。当会话M的事务结束后,会话M再去查询,才能查询到其他会话做出修改后的内容。

串行化----serializable

多个会话之间存在串行关系,如果会话之间都只是查询的话,那么不会存在阻塞。当其中的某些会话需要对表的数据进行增改的时候,必须的等待其他操作该表的会话结束后才会执行增改操作。

  • 读未提交:会产生脏读
  • 读已提交:解决了脏读问题,当修改的事务结束后再去读时会跟之前读的数据不一致,造成不可重复读
  • 可重复读:解决了重复读的问题,只要当前的会话不结束,重复读的数据永远一致,但当前的会话结束后再去读,数据跟之前的还是不一致,造成幻读。
  • 串行化: 解决了幻读,但同时带来了数据库的阻塞,造成效率问题。
原文地址:https://www.cnblogs.com/ivy-blogs/p/11768685.html