【问题标题】:A few basic questions about mysql关于mysql的几个基本问​​题
【发布时间】:2015-03-27 13:54:55
【问题描述】:

老师们!

刚接触mysql事务,有些问题不清楚。

  1. 如果发生“脏读”、“不可重复读”或“幻读”,事务会成功提交吗?
  2. 如果两个客户端同时更新一行,但是设置了不同的列,会不会出现问题? mysql如何处理更新?复制/修改/重写整行,还是单独更改修改后的字段?
  3. 如果写一个复杂的语句,比如

     CREATE OR REPLACE VIEW View_Rank AS (
        SELECT
            (
                SELECT
                    COUNT(1) + 1
                FROM
                    tb_Rank AS a
                WHERE
                    a.DId = b.DId
                AND (
                    a.Points > b.Points
                    OR (
                        a.Points = b.Points
                        AND (
                            a.PlayTime < b.PlayTime
                            OR (
                                a.PlayTime = b.PlayTime AND a.Id < b.Id
                            )
                        )
                    )
                )
            ) AS Rank,
            b.PersonId,
            b.DId
        FROM
            tb_Rank AS b
    ) ;
    

    会发生“不可重复读取”吗?

【问题讨论】:

    标签: mysql transactions


    【解决方案1】:

    1) 在 InnoDB 中,默认情况下,隔离是可重复读取的。通过锁定和版本控制,MySQL 确保一旦您读取了一行(或尝试读取一行,但没有找到它),该行在您的事务完成之前无法更改,因为它需要锁定它

    2) 一般而言,在使用 InnoDB 时,您的更新将锁定在第一个事务中,第二个事务将等待锁定释放,然后才能成功进行更新。

    3) 在 REPEATABLE READ 的默认隔离中,不可重复读取是不可能的,由于读取锁定,您的事务将不得不等待。

    这里有很多信息可以阅读: https://dev.mysql.com/doc/refman/5.6/en/innodb-transaction-model.html

    【讨论】:

    • 谢谢!这是完美的答案。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2016-10-19
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多