一、為什么一個事務能讀取到其他事務修改后未提交的數據
在沒有正式提交之前,數據是先更新到日志之中的,只有commit提交之后,才真正再從日志中更新到mysql表中。你不用去糾結為什么能讀到它。你只需知道,是事務與事務并發進行時,是具有影響性的,這種影響性的大小被稱為隔離級別。那怎么防止未提交讀呢?就是加寫鎖,然后提交之后釋放鎖,在這個時候,mysql的隔離級別就變成了已提交讀。而加鎖,釋放鎖是由mysql自動完成的,你無需關心。所以,其實本質上是鎖的應用,最終導致了不同的隔離級別,不同的隔離級別,鎖的應用也不同。
“數據未提交,那數據庫應該沒有改變”,這個假設其實是錯誤的。數據庫的底層設計都使用了WAL(Write-ahead**Logging)思想,只不過數據庫的事務隔離技術了提供了各種方案,一個數據庫請求即使事務沒有提交也會發生數據庫內部數據的變更,有各種技術,像Mysql InnoDB MVCC,只不過是通過一些字段進行控制。
在數據庫沒有提交數據的時候,你更新的數據是在緩存進行更新的,事務與事務在并發進行的時候就叫作隔離級別,只有在提交之后,數據才從日志中把數據更新到數據庫里面。
目前主流的關系型數據庫例如mysql、Oracle都是基于文件系統進行數據存儲的,即數據是持久化到文件系統的,但基于文件系統的隨機IO讀寫是非常慢的,故數據庫都會引入內存池,完成對磁盤數據的緩存,提高讀寫性能。內存池是對所有線程共享的,也就是對所有的數據庫事務是共享的,所謂的未提交,指的是事務未提交,但此時數據已經存儲到了共享內存中,數據已經進入到了數據庫服務器中,所以是可見的。
延伸閱讀:
二、MongoDB是什么
非關系型數據庫(nosql ),屬于文檔型數據庫。MongoDB采用類JSON的documents來存儲數據。數據結構由鍵值(key=>value)對組成。
MongoDB采用動態數據模型schema,這意味著不需要預先定義表的數據類型和字段名。當MongoDB需要更新文檔documents的時候,可以輕松增加新的字段名或者刪除舊的字段。MongoDB讓數據結構更加層級化,因而存儲數組等復雜數據結構。 在同一個集合collection中,文檔document對字段也沒有強約束,因此更容易設計差異化的數據結構。