版 權 聲 明
※※※※※※※※※※※※※※※※※※※※※※※※※※※※
(1)本文譯自維基百科(WikiPedia),原文地址如下:
http://en.wikipedia.org/wiki/Microsoft_Jet_Database_Engine#cite_note-0
無法登錄維基百科的朋友可以參考如下地址:
http://docs.google.com/Doc?id=dwdwvtj_178cvtn9pcd
(2)根據維基百科的著作權策略,本文內容在GNU Free Documentation License, Version 1.2下發布。
(3)關於GNU Free Documentation License,參考下列地址:
http://en.wikipedia.org/wiki/Wikipedia:Text_of_the_GNU_Free_Documentation_License
這裡有一個簡體中文翻譯版本:http://www.linuxfocus.org/Chinese/team/fdl.html
(4)從維基百科原文歷史中可以看到最近修改過原文的幾位作者如下:(2008/06/22為止)
Christopher G Lewis
SmackBot
Xpclient
Chowbok
S ried
Voyagerfan5761
Soumyasch
(5)本文譯者:David Lau ([email protected] )
※※※※※※※※※※※※※※※※※※※※※※※※※※※※
本文專門講述Microsoft Access的底層資料庫引擎JET Red;除了JET Red,Jet里還包括了一個被稱作Jet Blue的ISAM實現。關於Jet Blue,請參考Extensible Storage Engine。
作為資料庫的底層組件,資料庫引擎的主要功能體現在它能把信息有規律地存儲在計算機上。Jet是微軟開發的一種資料庫引擎,微軟還以它為基礎開發出了若干種產品,其中包括著名的Microsoft Access。Jet的第一個版本出現於1992年,當時它主要包括三個資料庫處理相關的模組。
JET 是Joint Engine Technology的縮寫,它的正式名稱是“微軟JET資料庫引擎(Microsoft JET Engine)”,但我們更喜歡用Jet這個簡單而直接的叫法。Microsoft Access使用Jet作為其默認的資料庫引擎,Visual Basic也曾這么做。不過,現在Jet已經被微軟的其他產品取代了,地位大不如從前了。關於Jet的繼任者安排問題,微軟顯得左右搖擺:首先是MSDE (Microsoft Desktop Engine),接著是SQL Server 2005 Express Edition,最近又換成了SQL Server 2005 Compact Edition。除此之外,你也應該了解,微軟的MDAC(Microsoft Data Access Components)里也不再包括Jet了。因此,如果你需要更大型的資料庫,可以考慮“升級”(按照Microsft的說法是“up-sized”)到微軟的旗艦產品SQL Server 2005。
多年來,Jet已經成為 Microsoft Access的代名詞,以致於許多人錯誤地認為Jet資料庫即是Microsoft Access資料庫,甚至連微軟的人有時候也搞錯。但是針對Jet這個術語的誤用現象應該得到糾正——Jet是一種資料庫,而Microsoft Access是一種資料庫應用程式開發工具。
![](/img/b/980/nBnauM3X1AzNyATN2gDM2EjNxMTM3UTM1kTMwADMwAjM2EzL4AzLxYzLt92YucmbvRWdo5Cd0FmLzE2LvoDc0RHa.jpg)
內容概要
1 架構(Architecture)
1.1 鎖(Locking)
1.2 事務處理(Transaction Processing)
1.3 數據完整性(Data integrity)
1.4 安全(Security)
1.5 查詢(Queries)
2 歷史回顧
3 未來展望
4 參考資料
架構(Architecture)
Jet 能夠用於操作關係資料庫,它同時也是關係資料庫管理系統(Relational Database Management System,RDBMS)的一部分。其他軟體可以利用Jet提供的接口來訪問微軟資料庫產品里存放的數據;Jet也提供安全、參照完整性(referential integrity)、事務處理(transaction processing)、索引(Indexing)、記錄(Record)、頁級別鎖定(page locking)和資料庫複製(replication)等功能支持。較新版本的Jet有一些功能上的增強,它能執行SQL查詢(SQL query),能以Unicode格式存儲字符數據,支持視圖(database view),也能實現與Microsoft SQL Server之間的雙向複製(bi-directional replication with Microsoft SQL Server)。
Jet 由三個模組構成:第一個是Native Jet ISAM Driver——這是一個DLL,它使用ISAM(Indexed Sequential Access Method)技術操作Microsoft Access資料庫檔案(*.mdb);第二個模組是ISAM Driver——這是一組DLL,用於訪問諸如Xbase、 Paradox、 Btrieve、FoxPro之類的ISAM資料庫檔案;最後一個模組是DAO DLL( Data Access Objects)。DAO提供了一組方法,允許程式設計師使用VBA(Visual Basic for Applications)和VB訪問Jet資料庫。
鎖(Locking)
Jet 允許多用戶並行訪問資料庫。它採用了一種數據寫入鎖機制(data write locking policy),當多個用戶同時對資料庫執行寫操作時數據不會遭到破壞。用戶只能修改那些已經被加鎖的記錄,加鎖讓用戶以獨占的方式操作特定資料庫記錄直到鎖被釋放為止。Jet 4.0之前一直使用頁面鎖模型(page locking model),Jet 4.0開始支持行級鎖模型(record locking model)。頁面(Page)指的是一種長度固定的數據結構——Microsoft的資料庫物理上是由一個個頁面組成的,Jet 4.0之前一個頁面的大小2KB,Jet 4.0開始變為4KB。然而,用戶終究是以記錄(Record)為單位來存取數據的,一條記錄占據的空間可能不足一個頁面,也可能多於一個頁面。頁面鎖模型一次只能鎖定整數個頁面,而不是單個記錄,這意味著某些時候使用頁面鎖模型可能導致一條多條記錄被鎖住。
微軟使用了兩種鎖定機制:悲觀鎖(pessimistic locking)和樂觀鎖(optimistic locking)。如果使用悲觀鎖,當一個加鎖請求發生時目標記錄(Record)或者目標頁面(Page)立即會被鎖住。樂觀鎖則不然,它會等到所有的資料庫記錄(Record)修改都完成後才動作。儘管目標記錄或者目標頁面被鎖住的時間會很短,但在這段時間內其他用戶還是無法訪問它們;使用樂觀鎖能儘量縮短目標記錄或者目標頁面被鎖住的時間,這意味著發生鎖定衝突(Lock Conflict)的可能性更低一些。然而,使用樂觀鎖也更容易導致資料庫更新失敗,因為別的用戶可能會搶先一步鎖住你想要的那條記錄;如果使用悲觀鎖就不會發生這種情況——只要你能成功鎖定目標記錄則更新必然會被執行。一般來說,使用悲觀鎖比較容易導致鎖定衝突。如果遇到鎖定衝突,用戶必須等到修改完成,鎖定被釋放才能繼續更新資料庫,也有可能因為逾時導致請求失敗。
事務處理(Transaction processing)
Jet 具有大多數資料庫都支持的事務處理能力。不過,此處需要澄清一下,這裡說的是“大多數”,而不是“全部”;換句話說,並非所有資料庫都有這種能力—— ODBC資料庫僅支持一級事務處理(one level transaction processing),而像Paradox這樣的ISAM資料庫沒有事務處理能力。事務指的是在資料庫中進行的一組動作,他們必須一起完成——這被稱作原子性(atomicity),它是ACID(Atomicity, Consistency, Isolation, and Durability)的一部分;對於資料庫系統的事務處理,ACID是極端重要的概念。Jet 3.0之前,為了執行事務處理,程式設計師必須先手動開始一個事務,接著執行各種資料庫更新,最後提交(Commit)事務。在事務提交動作發生之前,所有操作只會發生在記憶體里,並不實際寫入磁碟。比起來單純的資料庫更新操作,事務有許多優勢,其中最重要的一點在於:執行過程中如果發生了錯誤,能夠取消整個事務,資料庫里的數據不會遭到破壞。取消事務的動作被稱作回滾(Rollback),它能夠把數據記錄精確地恢復到事務開始前的狀態,就好像什麼也不曾發生過一樣。在一系列原子操作執行過程中如果發生了故障,事務能夠保證數據的一致性。事務處理的獨特之處在於它能保證一組操作要么全部成功,要么全部失敗(這意味著資料庫重啟時會自動放棄數據更動),不會出現僅僅有一部分更新操作結果被寫入磁碟的情況。順便說一下,使用ODBC的in-memory機制,也能做到讓全部更新動作先行發生在記憶體里,最後僅執行一次昂貴的寫入磁碟。
Jet 3.0開始支持隱式的事務(Implicit transactions)。當最後一個事務被提交之後,資料庫會自動開啟一個新的事務。最初的時候當執行DML SQL語句時Jet也會自動開啟一個隱式事務,不久人們就發現這在一定程度上會影響程式性能;因此,Jet 3.5去掉了它。
數據完整性(Data integrity)
Jet 強制執行實體完整性(entity integrity)和參照完整性(referential integrity)。實體完整性是關係資料庫的關鍵概念之一,它保證記錄不會重複存在,並且主鍵(primary key)也不會被賦值為NULL。當然,Jet也支持主鍵。參照完整性指的是外鍵(freign key)必須和資料庫內業已存在的主鍵相一致。如果一個外鍵值存在,但在被參照表里卻沒有與之對應主鍵,那么參照完整性就被破壞了,這將導致兩個表的數據無法保持一致性。
舉例來講,一個音樂愛好者可能會建立一個資料庫,其中存儲了藝術家以及音樂作品相關的信息。在這個例子裡面,一個藝術家可能擁有許多唱片,但一張唱片只能屬於一個藝術家。於是我們創建了兩個表:Artist和 Album。Artist表以artist_id為主鍵,Album表以album_id為主鍵。 Album表有個欄位artist_id,它作為外鍵,和Artist表的同名主鍵artist_id含義相同。如果一個藝術家的記錄(Record)出於某種原因從Artist 表里被刪除掉了,而在Album表里該藝術家的唱片記錄卻依然存在的話,參照完整性就已經被破壞了。默認情況下,Jet會阻止這種事情發生;而且,Jet 也支持級聯更新和級聯刪除(cascading updates and deletes)。如果針對album表設定了“級聯刪除”,那么在前面那個例子裡,當一個藝術家被從Artist表里刪除的時候,那個藝術家的所有唱片都會從Album表里自動刪除。
Jet 也支持所謂的“業務規則(business rules)”,也被稱作“約束(constraints)”。約束是套用於某些欄位的條件和規則,能強制做到“只有符合這些要求的數據才會被放到表里 ”。例如,可以通過添加約束來保證過去的日期和時間值不會寫入date_logged欄位,或者要求一個數值字段只接受大於0的數值。
安全性(Security)
對 Jet資料庫的訪問需以用戶為單位。用戶信息存放於單獨的系統資料庫(System Database)里,並且Jet在資料庫對象(例如:表、查詢)級別上實現訪了問控制。從Jet 4.0開始資料庫管理員可以使用CREATE、ADD、ALTER、DROP USER以及DROP GROUP等SQL命令完成安全性設定。上述命令都是ANSI SQL 92標準的子集。資料庫管理員也可以使用GRANT/REVOKE命令(※參考資料1)。除此之外,從Jet 2.0開始程式設計師已經可以使用DAO編程實現資料庫安全性的設定了。
查詢(Queries)
Jet 可以用於查詢並獲取資料庫中的數據。我們可以通過Microsoft QBE(Query By Example)、Microsoft Access的SQL視窗或者Microsft Access Basic的DAO(Data Access Objects)語言來定義查詢。Jet先將查詢轉換為SELECT SQL語句,之後進行編譯。編譯是一個複雜的過程,它不僅執行諸如語法檢查、確定目標欄位歸屬哪個表之類的語法解析動作,還會將SQL轉換成一種樹形結構,稱作“Jet內部查詢對象(internal Jet query object)”。除了上述動作,對於Jet 3.0以後的版本而言,還將調用Microsft rushmore查詢最佳化技術執行最佳化動作。最後,Jet會執行查詢並將結果返回給應用程式或者用戶。
Jet 以一種動態記錄集(Dynaset)的形式返回查詢結果。所謂“動態記錄集(Dynaset)”指的是一組動態地關聯到後台資料庫的數據。動態記錄集允許用戶直接查看或者修改其中的數據,而僅僅把查詢結果存入臨時表的做法則無法實現直接修改。假定一個大學教師查詢所有學生的成績時發現其中某條存在錯誤,那么他只需要修改動態記錄集裡的數據即可,因為動態記錄集會自動更新後台資料庫;也就是說,他沒有必要先將查詢結果存入一個臨時表,然後再專門針對那條錯誤數據執行一條更新查詢(update query)。
歷史回顧
Jet 始於1992年,那個時候Microsoft內部的資料庫產品項目組正在開發一種代號為Cirrus底層數據訪問技術。Cirrus是用VB的早期版本實現的,它被用作Microsoft Access的資料庫引擎。Tony Goodhew當時正在Microsoft工作,他說——
到了那個階段,基本上可以說Jet項目組所做的工作已經超越了最初的目標。最初項目組的任務僅僅是為Microsoft Access開發資料庫引擎模組,而不是完成一個通用組件。在那之後,VB 3.0項目組為了將Jet移植到VB上,不得不先設法把Jet從Micrisoft Access里分離出來。這也就是為什麼VB 3.0也和Microsoft Access一樣有那么多Jet/ODBC方面的問題。
由於Access ODBC開發組使用Jet的一部分代碼實現了ODBC驅動程式,隨Microsoft Access 2.0發布的Jet新版本變得更加組件化了。這個版本的一個改進是允許VB 3.0調用新版本的Jet。(※參考資料2)
表1 Jet DLLs
------------------------------------------------------------------------------
Jet version Jet engine DLL file name MDB version
------------------------------------------------------------------------------
1.1 1.10.0001MSAJT110.DLL 1.0 / 1.1
2.0 (comlyr) 2.00.0000 MSAJT200.DLL 1.0 / 1.1 / 2.0
2.5 (accsvc) 2.50.1606 MSAJT200.DLL 1.0 / 1.1 / 2.0 / 3.0
2.5 (VB4 16) 2.50.1606 MSAJT200.DLL 1.0 / 1.1 / 2.0 / 3.0
3.0 3.0.0.2118 msjt3032.dll 1.0 / 1.1 / 2.0 / 3.0
3.5 msjet35.dll 1.0 / 1.1 / 2.0 / 3.0
4.0 (SP7) 4.0.7328.0 msjet40.dll 1.0 / 1.1 / 2.0 / 3.0 / 4.0
-----------------------------------------------------------------------------
※數據來源
http://support.microsoft.com/kb/178880/en
http://support.microsoft.com/kb/282010/en
表2 Jet版本
-----------------------------------------------------------------------------
Application/Version Jet version
-----------------------------------------------------------------------------
Microsoft Access 1.0 1.0
Microsoft Access 1.1 1.1
Microsoft Access 2.0 2.0
Microsoft Access 2.0 2.5 with Microsoft Access Service Pack
Microsoft Access 7.0 3.0
Microsoft Access 97 3.5 with Office 97
Microsoft Access 97 SR1 3.5 with Office 97SR1
Visual Basic 3.0 1.1
Visual Basic 3.0 2.0 with Visual Basic Compatibility Layer
Visual Basic 3.0 2.5 with Microsoft Access Service Pack
Visual Basic 4.0 16-bit 2.5
Visual Basic 4.0 32-bit 3.0
Visual Basic 5.0 32-bit 3.0
Visual Basic 5.0 32-bit 3.5
Visual C++ 4.X 3.0
Visual C++ 5.03.5
Jet 3.51 (web download) 3.51 (3.5 Binary compatible)
Microsoft Access 2000 Standard Edition 4.0
Microsoft Access 2002 Standard Edition 4.0
Microsoft Access 2003 Standard Edition 4.0
----------------------------------------------------------------------------
※來源:
INFO: Identifying the Jet Database Engine Components(http://support.microsoft.com/kb/178880/en )
How to find information about Microsoft Jet 4.0 Service Pack 7(http://support.microsoft.com/kb/282010/en )
Jet 2.0以數個DLL(dynamic linked libraries)的形式出現,Microsoft Access等應用程式中用到了它們。Windows下的DLL檔案是可以被多個應用程式共用的代碼庫——把多個應用程式的共通部分抽出來,做成功能通用而代碼相互獨立的代碼庫是減少維護工作量、提高開發效率的好辦法。Jet 2.0由三組DLL組成:Jet DLL、DAO DLL和ISAM DLLs。Jet DLL知道正在訪問的資料庫屬於何種類型以及如何執行客戶端應用程式發過來的請求。如果數據源是MDB檔案(即Microsoft Access檔案),Jet DLL將直接讀寫檔案中的數據。如果是外部數據源,Jet DLL將調用ODBC驅動程式來執行客戶端應用程式的請求。DAO DLL提供了一組接口,程式設計師藉此能夠訪問Jet引擎。Visual Basic程式設計師和Access Basic程式設計師會經常使用DAO DLL。ISAM DLLs是一組模組。有了它們,Jet就可以訪問三種基於ISAM的資料庫:Xbase、Paradox和Btrieve。
Jet 3.0在以下方面做了改善:
※ 新的索引(Index)結構,降低了索引占用的存儲空間,減少了重複創建索引時所需的時間。
※ 去掉了Index Page上的讀鎖定(read lock)。
※ 一種新的Page復用機制。
※ 一種新的壓縮方法,壓縮資料庫使得索引以clustered-index格式存放。
※ 一種新的Page分配機制,它改善了Jet的Read-ahead能力。
※ 改善了刪除操作,使之速度更快。
※ 多執行緒(有三個執行緒,分別用於執行read ahead, write behind和 cache maintenance)。
※ 增加了隱式事務功能,這樣用戶就不必以手動方式開啟和提交一個事務。
※ 一個新的排序引擎,用於把Memo或者binary data這樣的數據類型存儲在單獨的表里並支持動態擴展快取。有了這個排序引擎,Jet可以在起動時分配快取,並且快取大小沒有限制;另外,快取淘汰機制從 FIFO(first in, first out,先進先出)變成了LRU(least recently used)。(※參考資料3)
※ 資料庫複製支持。
Jet 4.0擁有以下幾個方面的新增特性和改善(※參考資料1):
※ Unicode字元存儲支持。由於使用了一種NT sorting method,在Windows 95上也支持Unicode存儲了。
※ 數據類型方面發生了改變,看起來更像SQL Server的數據類型了(LongText/Memo; Binary; LongBinary; Date/Time; Real; Float4; IEEESingle; Double; Byte/TINYINT; Integer/Integer synonyms SMALLINT, Integer2, Short; LongInteger/ LongInteger synonyms Int, Integer, Counter; Auto-Increment support; Currency/Money; Boolean ;GUID)。另外,還包括一種新的Decimal類型。
※ Memo files索引支持。
※ 可壓縮的數據類型。
※ SQL增強,令Jet SQL更加接近於ANSI SQL-92。
※ 粒度更細的安全性支持。
※ 支持視圖和存儲過程。
※ 支持事務的開啟和中止(即提交和回滾)。
※ 表的創建和修改方面的增強。
※ 支持參照完整性。
※ 資料庫連結控制(已經處於連線狀態的用戶能保持連線,但一旦斷開則無法再次連線;並且無法建立新連結。當資料庫管理員想獲得資料庫控制權時這一點非常有用。)
※ 一個用戶列表,管理員可以據此知道誰正處於連線狀態。
※ 行級鎖定(Record-level locking)(之前的版本僅支持也鎖定(page-locking))。
※ 支持與SQL Server之間的雙向複製。
Microsoft Office 2000 Professional版包含了一個名為“Microsoft Access升級嚮導(Microsoft Access Upsizing Wizard)”的實用工具。使用這個工具可以把Jet 4.0資料庫升級到SQL Server,並能保留原有Jet資料庫的表結構、數據以及其他一些屬性。但是該實用工具並不能處理Microsoft Access的報表(Report)、查詢(Query)、宏(Macro)以及安全設定(Security)。如果原來的Jet資料庫使用了這些Jet 特有功能,那么手動升級無法避免。
未來展望
從數據訪問技術的角度來看,微軟現在已經不推薦大家使用Jet(※參考資料4)。 Jet也已經不再是MDAC(Microsoft Data Access Components)安裝包的一部分了。然而,Jet將繼續作為Microsoft Access的主要資料庫引擎繼續存在。Microsoft Access 2007包含了一個Jet新版本,它獨立於過去Windows MDAC里自帶的那個版本,數據檔案格式卻和舊版完全兼容。新版本的Jet只能通過Microsoft Access來訪問,並且以後也會隨著Microsoft Access的發布而更新(※參考資料5)。
到目前為止,微軟並沒有計畫在64位的Windows上支持Jet。在可預見的未來,Jet可能只有32位的版本。這意味著原生的64位應用程式無法通過 ODBC、OLE DB或者其他途徑訪問存儲在MDB檔案里的數據——除非我們通過一個32位的軟體作為中介,在64位客戶端和32位客戶端之間架起一座橋(※參考資料6)。
參考資料
1. MS KB article 275561 (2007-01-29).
Description of the new features that are included in Microsoft Jet 4.0.
http://support.microsoft.com/kb/275561/en
Microsoft. Retrieved on 2008-06-19.
2. Goodhew, Tony (1996), Jet Engine: History,
http://www.avdf.com/nov96/acc_jet.html
Retrieved on 19 June 2008
3. MS KB article 137039 (2003-12-03).
New Features in Microsoft Jet Version 3.0.
http://support.microsoft.com/kb/137039/en
Microsoft. Retrieved on 2008-06-19.
4. Shirolkar, Prash; Henry, Alyssa; Pepitone, Stephen; Bunch, Acey J.;
(2008), Data Access Technologies Road Map,
Microsoft Corporation,
http://msdn.microsoft.com/en-us/library/ms810810.aspx
Retrieved on 19 June 2008
5. Rucker, Erik (2005-10-13). Access 12's new data engine.
http://blogs.msdn.com/access/archive/2005/10/13/480870.aspx
Retrieved on 2008-06-19.
6. Gorm Braarvig. Access database from SQL 2005/64.
http://gorm-braarvig.blogspot.com/2005/11/access-database-from-sql-200564.html
Retrieved on 2007-06-18.
7. Microsoft, "Microsoft Access 2000 Data Engine Options", white paper.
8. Erik Rucker Access 2007 database limits
http://blogs.msdn.com/access/archive/2006/06/05/access-2007-limits.aspx