• mysql事务特点总结


    1.mysql事务有4个隔离级别,以及会出现的问题如下图:

    2. 脏读:

    开启事务A,B。事务A在还没有提交的情况下,假如第一次查询id=1的用户的age=24。事务B执行了update 表 set age = 100 where id = 1; B事务并没有提交,紧接着再次查询id=1的用户的age时,age变成了其他值,这时事务A中出现了脏读。

    解决办法: 在事务中,读取数据的时候加共享锁。 select ... lock in share mode;

    3. 不可重复读:

    什么是不可重复读?举例说明,两个事务A, B。两个事务查询结果都是id=1的用户age=24,id=2的用户age=25。这时A执行update 表 set age = 100 where id = 1; 这时A还没有提交,B也没有提交,B来查询id=1的用户age还是=24,然后A执行commit。此时B再次查询id=1的用户的age就=100,事务B并没有重复读取到之前id=1记录的状态。

    不可重复读和脏读的区别就在于,修改了数据的事务有没有执行commit。没有提交,另一事务数据隔离性出现问题叫脏读;提交了,另一事务数据隔离性出现问题叫不可重复读。

    解决办法:给每个事务增加客户端快照--可重复读隔离级别。

    4. 幻读:

    两个事务A,B。两个事务一开始 select * from '表' 查询出来的数据都是一样的,假如是5行记录,把这时数据状态称为"数据状态1"。这时,事务Ainsert一条记录,然后commit。这时B查询select * from '表',数据还是"数据状态1",5行数据,然后执行update '表' set column='xxx',看下面返回的Rows matched: 会是6,比5行多一行!然后再执行select * from '表',返回了6行数据!多出了一行,好像之前5行的数据是幻觉一样。这种情况,就叫幻读。

    解决办法: mvcc,多版本控制,也叫乐观锁。

    5.查看会话的隔离级别:

    select @@global.tx_isolation;

    6. 修改会话的隔离级别:

    set tx_isolation='read-committed';

    7. 可串行化隔离级别最高,通过对更改操作(cud)加排他锁,查询操作加共享锁,没有客户端快照 来实现的。除了两个事务都是执行的select操作,不阻塞另一事务外。其他交替出现的操作都会阻塞另一事务,知道该事务commit。

    8. 如果一个事务A(任何隔离级别下)对某行记录执行了更改操作,这时一个普通操作(非事务)也对该行记录执行更改操作的化,会被阻塞,直到事务A commit.

  • 相关阅读:
    JS字符串函数String.replace()[转]
    分辨率和比例尺[转]
    DateDiff 函数的用法 SQL时间比较
    ASP.NET 2.0 本地化2
    ASP.NET 2.0 本地化1
    简单的分页过程,确在第10,20,30....等页,不能显示,请求帮忙,谢谢
    JQuery打造的分页无刷新的Repeater
    让flash置于DIV层之下的方法,让flash不挡住飘浮层或下拉菜单
    VS2005 + VSS6.0 简单应用示例
    SQLServer查询最近一天,三天,一周,一月,一季度方法
  • 原文地址:https://www.cnblogs.com/xiaoxlm/p/10173802.html
Copyright © 2020-2023  润新知