关于 mysql 的几个基本问​​题

A few basic questions about mysql

老师们!

刚接触mysql交易,有些问题不清楚。

  1. 如果发生"dirty read"、"non repeatable read"或"phantom read",交易会成功提交吗?
  2. 如果两个客户端同时更新一行,但是设置了不同的列,会不会出现问题? mysql 如何处理更新? copy/modify/rewrite整行,还是单独更改修改字段?
  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
    ) ;
    

    "non repeatable read"会发生吗?

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

2)一般来说,使用InnoDB时你的update会在第一个transaction中加锁,第二个事务会等到锁被释放后才能成功update。

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

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