SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
{
REPEATABLE READ
| READ COMMITTED
| READ UNCOMMITTED
| SERIALIZABLE
}
答案 0 :(得分:1)
事务隔离控制当前会话是否看到更新,因为其他会话正在同时更改数据。
例如,如果启动事务,您可能希望在完成事务之前查看数据库的稳定视图。如果您在几分钟内运行多个报告类型查询,并且您希望数字匹配,即使基础数据正在发生变化,这也很重要。
如果将隔离级别设置为REPEATABLE READ
(默认值),则表示您的事务会在您启动事务的瞬间读取数据。只有当您完成该事务并启动另一个事务时,您才能在SELECT时看到更新的数据。
这意味着MySQL必须保留同一行的多个副本,并跟踪哪个事务可以查看哪个版本。
如果让事务全天运行,则意味着无法从数据库中清除旧版本的更新行,因为长时间运行的事务可能需要查看它们
如果您将隔离级别设置为READ COMMITTED
,那么当其他人对数据进行更改时,您对数据的“查看”包括下次执行SELECT时的更改。这很好,因为可以立即清除旧版本的行。
READ UNCOMMITTED
,但几乎没有理由使用它。这意味着您可以在提交之前查看其他会话中的更改。通过类比,在我点击“发布你的答案”之前,你可以在我输入时阅读我的帖子。这不是一个非常有用的技巧,因为你可以选择并查看一些更新,然后它们就会消失,因为该用户决定回滚。
SERIALIZABLE
也支持标准,不经常使用。此模式意味着如果您选择SELECT,那么您的事务会隐式锁定您在共享模式下选择的行,即多个人可以同时选择相同的行而不会发生冲突,但如果任何一个会话具有该类型的锁,则没有人可以更新或删除这些行。
您应该阅读http://dev.mysql.com/doc/refman/5.6/en/set-transaction.html了解更多详情。