关于 mysql 的几个基本问题
A few basic questions about mysql
老师们!
刚接触mysql交易,有些问题不清楚。
- 如果发生"dirty read"、"non repeatable read"或"phantom read",交易会成功提交吗?
- 如果两个客户端同时更新一行,但是设置了不同的列,会不会出现问题?
mysql 如何处理更新? copy/modify/rewrite整行,还是单独更改修改字段?
如果写一个复杂的语句,比如
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
老师们!
刚接触mysql交易,有些问题不清楚。
- 如果发生"dirty read"、"non repeatable read"或"phantom read",交易会成功提交吗?
- 如果两个客户端同时更新一行,但是设置了不同的列,会不会出现问题? mysql 如何处理更新? copy/modify/rewrite整行,还是单独更改修改字段?
如果写一个复杂的语句,比如
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