• MySQL事务的隔离级别


    事务的隔离级别

    并发务带来的问题

    • 脏写(Dirty Write):如果一个事务修改了另一个未提交事务修改过的数据,那就意味着发生了脏写。

     

    • 脏读(Dirty Read):如果一个事务读到了另一个未提交事务修改过的数据,那就意味着发生了脏读。

     

    • 不可重复读(Non-repeatable Read):如果一个事务只能读到另一个已经提交的事务修改过的数据,并且其他事务每对该数据进行一次修改并提交后,该事务都能查询得到最新值,那就意味着发生了不可重复读。

     

    • 幻读(Phantom):如果一个事务先根据某些条件查询出一些记录,之后另一个事务有向表中插入了符合这些条件的记录,原先的事务再次按照该条件查询时,能把另一个事务插入的记录也读出来,那就意味发生了幻读。注意:幻读强调的是一个事务按照某个相同条件多次读取记录时,后读取时读到了之前没读到的记录。如果是后读取记录变少了,就不是幻读,相当于每一条记录都发生了不可重复读的现象。

     

    • 幻读问题的产生是因为某个事务读了一个范围的记录,之后别的事务在该范围内插入了新记录, 该事务再次读取该范围的记录时,可以读到新插入的记录,所以幻读问题准确的说并不是因为读取 和写入一条相同记录而产生的。

    事务的隔离级别

    READ UNCOMMITTED: 未提交读

    READ COMMITTED:已提交读

    REPEATABLE READ :可重复读

    SERIALIZABLE:可串行化

    针对不同隔离级别,并发事务可以发生的问题不同:每个级别都不可能发生脏写

    • READ UNCOMMITTED(未提交读):可能发生脏读,不可重复读和幻读问题

    • READ COMMITTED(已提交读):可能发生不可重复读和幻读问题,但不可能发生脏读问题

    • REPEATABLE READ(可重复读):可能发生幻读问题,但不可能发生脏读和可重复读问题

    • SERIALIZABLE(可串行化):各种问题都不可能发生

    MySQL 虽然支持4种隔离级别,但与 SQL标准 中所规定的各级隔离级 别允许发生的问题却有些出入,MySQL在REPEATABLE READ(可重复读)隔离级别下,是可以禁止幻读问题的发生的

     

    MySQL 的默认隔离级别为 REPEATABLE READ(可重复读)

    查看隔离级别

    1.  show variables like 'transaction isolation';
    2.  -- 或者
    3.  select @@transaction_isolation-

    我们可以手动更改事务的隔离级别:

     set [GLOBAL|SESSION] TRANSACTION ISOLATION LEVEL (级别);

    设置事务的隔离级别的语句中,在 SET 关键字后可以放置 GLOBAL 关键字、 SESSION 关键字或者什么都不放,这 样会对不同范围的事务产生不同的影响,具体如下:

    • 使用GLOBAL关键字(在全局范围影响):只对执行完该语句之后的会话起作用,当前已经存在的会话无效

    • 使用SESSION关键字(在会话范围影响):对当前会话的所有后续的事务有效;该语句可以在已经开启的事务中间执行,但不会影响当前正在执行的事务,如果在事务之间执行,则对后续的事务有效。

    • 两个关键字都不使用(只对执行语句后的下一个事务产生影响):只对当前会话中下一个即将开启的事务有效;下一个事务执行完后,后续事务将恢复到之前的隔离级别;该语句不能在已经开启的事务中间执行,会报错。

  • 相关阅读:
    20220720_JSON使用案例_数据库查询和新增
    flutter card 使用示例
    安装vim插件慢怎么办?
    Kubernetes(k8s)的Pod控制器DaemonSet详细讲解
    Nginx实现本地http转https请求
    Sql中having和where的区别
    SpringBoot+Vue实现前后端分离旅游资源信息系统
    项目部署java
    什么是性能测试混合场景?性能测试混合场景如何测试?
    Java各种数据结构的定义(如何写测试用例)
  • 原文地址:https://blog.csdn.net/qq_53916344/article/details/125429392