2015-10-19 208 views
2

Oracle不允許髒讀,因此甚至不允許從JDBC設置讀未提交。MySQL InnoDB如何實現讀未提交隔離級別

當選擇Read Uncommitted時,PostgreSQL也會退回到Read Committed。

由於SQL Server的併發控制模型基於鎖定(除非切換到兩個快照隔離級別),因此SQL Server定義了Read Uncommitted隔離級別,因此它可能是唯一可以看到某些性能優勢的數據庫,從避免鎖定報表這並不需要嚴格的一致性。

InnoDB也使用MVCC,但與Oracle和PostgreSQL不同,它允許髒讀。爲什麼這樣?直接進入最新版本有沒有任何性能優勢,而不是從回滾段重建以前的版本?回滾段查詢時間是否會恢復這種需要髒讀取的密集進程?

+2

你見過這個博客嗎? https://www.percona.com/blog/2015/01/14/mysql-performance-implications-of-innodb-isolation-modes/ – Shadow

回答

1

我知道的主要優點是,如果所有的會話都是READ-UNCOMMITTED,那麼家務管理(清理UNDO)將永遠不會被阻止,等待舊會話。

如果不需要爲READ-UNCOMMITTED事務本身創建讀取視圖結構(example),則可能會有其他性能上的提升,但我自己並未證實此問題。一般來說,這不是InnoDB團隊針對優化的隔離級別。

編輯:就展開回滾段的性能而言,是的,它可能會很慢,並且有很多修訂。 AFAIK這是一個簡單的鏈接列表,並且可能需要許多遍歷。與PostgreSQL的比較是很難做到的,因爲體系結構(mysql特性UNDO)是完全不同的。一般來說,我認爲當搬遷是「合乎邏輯的+適合工作集合」時,UNDO運作良好;即它在內存中執行,但在需要物理IO之前清理。