Hubbry Logo
Access Database EngineAccess Database EngineMain
Open search
Access Database Engine
Community hub
Access Database Engine
logo
7 pages, 0 posts
0 subscribers
Be the first to start a discussion here.
Be the first to start a discussion here.
Contribute something
Access Database Engine
Access Database Engine
from Wikipedia

Access Database Engine
Other names
  • ACE Database Engine
  • Office Access Connectivity Engine (ACE)
  • Microsoft JET Engine
  • Microsoft Jet Database Engine
  • Jet Red
  • Joint Engine Technology (JET)
DeveloperMicrosoft
Initial release1992; 33 years ago (1992)
Stable release
ACE 16
Operating systemMicrosoft Windows
TypeDatabase engine
Websiteoffice.microsoft.com/en-us/access/ Edit this on Wikidata

The Access Database Engine (also Office Access Connectivity Engine or ACE and formerly Microsoft Jet Database Engine, Microsoft JET Engine or simply Jet) is a database engine on which several Microsoft products have been built. The first version of Jet was developed in 1992, consisting of three modules which could be used to manipulate a database.

JET stands for Joint Engine Technology. Microsoft Access and Visual Basic use or have used Jet as their underlying database engine. However, it has been superseded for general use, first by Microsoft Desktop Engine (MSDE), then later by SQL Server Express. For larger database needs, Jet databases can be upgraded (or, in Microsoft parlance, "up-sized") to Microsoft's flagship SQL Server database product.

Architecture

[edit]

Jet, being part of a relational database management system (RDBMS), allows the manipulation of relational databases.[1] It offers a single interface that other software can use to access Microsoft databases and provides support for security, referential integrity, transaction processing, indexing, record and page locking, and data replication. In later versions, the engine has been extended to run SQL queries, store character data in Unicode format, create database views and allow bi-directional replication with Microsoft SQL Server.

Jet DLLs

There are three modules to Jet: One is the Native Jet ISAM Driver, a dynamic link library (DLL) that can directly manipulate Microsoft Access database files (MDB) using a (random access) file system API. Another one of the modules contains the ISAM Drivers, DLLs that allow access to a variety of Indexed Sequential Access Method ISAM databases, among them xBase, Paradox, Btrieve and FoxPro, depending on the version of Jet. The final module is the Data Access Objects (DAO) DLL.[2] DAO provides an API that allows programmers to access JET databases using any programming language.

Locking

[edit]

Jet allows multiple users to access the database concurrently. To prevent that data from being corrupted or invalidated when multiple users try to edit the same record or page of the database, Jet employs a locking policy. Any single user can modify only those database records (that is, items in the database) to which the user has applied a lock, which gives exclusive access to the record until the lock is released. In Jet versions before version 4, a page locking model is used, and in Jet 4, a record locking model is employed. Microsoft databases are organized into data "pages", which are fixed-length (2 kB before Jet 4, 4 kB in Jet 4) data structures. Data is stored in "records" of variable length that may take up less or more than one page. The page locking model works by locking the pages, instead of individual records, which though less resource-intensive also means that when a user locks one record, all other records on the same page are collaterally locked. As a result, no other user can access the collaterally locked records, even though no user is accessing them and there is no need for them to be locked. In Jet 4, the record locking model eliminates collateral locks, so that every record that is not in use is available.

There are two mechanisms that Microsoft uses for locking: pessimistic locking, and optimistic locking. With pessimistic locking, the record or page is locked immediately when the lock is requested, while with optimistic locking, the locking is delayed until the edited record is saved. Conflicts are less likely to occur with optimistic locking, since the record is locked only for a short period of time. However, with optimistic locking one cannot be certain that the update will succeed because another user could lock the record first. With pessimistic locking, the update is guaranteed to succeed once the lock is obtained. Other users must wait until the lock is released in order to make their changes. Lock conflicts, which either require the user to wait, or cause the request to fail (usually after a timeout) are more common with pessimistic locking.

Transaction processing

[edit]

Jet supports transaction processing for database systems that have this capability (ODBC systems have one-level transaction processing, while several ISAM systems like Paradox do not support transaction processing). A transaction is a series of operations performed on a database that must be done together — this is known as atomicity and is one of the ACID (Atomicity, Consistency, Isolation, and Durability), concepts considered to be the key transaction processing features of a database management system. For transaction processing to work (until Jet 3.0), the programmer needed to begin the transaction manually, perform the operations needed to be performed in the transaction, and then commit (save) the transaction. Until the transaction is committed, changes are made only in memory and not actually written to disk.[1] Transactions have a number of advantages over independent database updates. One of the main advantages is that transactions can be abandoned if a problem occurs during the transaction. This is called rolling back the transaction, or just rollback, and it restores the state of the database records to precisely the state before the transaction began. Transactions also permit the state of the database to remain consistent if a system failure occurs in the middle of a sequence of updates required to be atomic. There is no chance that only some of the updates will end up written to the database; either all will succeed, or the changes will be discarded when the database system restarts. With ODBC's in-memory policy, transactions also allow for many updates to a record to occur entirely within memory, with only one expensive disk write at the end.

Implicit transactions were supported in Jet 3.0. These are transactions that are started automatically after the last transaction was committed to the database. Implicit transactions in Jet occurred when an SQL DML statement was issued. However, it was found that this had a negative performance impact in 32-bit Windows (Windows 95, Windows 98), so in Jet 3.5 Microsoft removed implicit transactions when SQL DML statements were made.

Data integrity

[edit]

Jet enforces entity integrity and referential integrity. Jet will by default prevent any change to a record that breaks referential integrity, but Jet databases can instead use propagation constraints (cascading updates and cascading deletes) to maintain referential integrity.

Jet also supports "business rules" (also known as "constraints"), or rules that apply to any column to enforce what data might be placed into the table or column. For example, a rule might be applied that does not allow a date to be entered into a date_logged column that is earlier than the current date and time, or a rule might be applied that forces people to enter a positive value into a numeric only field.

Security

[edit]

Access to Jet databases is done on a per user-level. The user information is kept in a separate system database, and access is controlled on each object in the system (for instance by table or by query). In Jet 4, Microsoft implemented functionality that allows database administrators to set security via the SQL commands CREATE, ADD, ALTER, DROP USER and DROP GROUP. These commands are a subset of ANSI SQL 92 standard, and they also apply to the GRANT/REVOKE commands.[3] When Jet 2 was released, security could also be set programmatically through DAO.

Queries

[edit]

Queries are the mechanisms that Jet uses to retrieve data from the database. They can be defined in Microsoft QBE (Query By Example), through the Microsoft Access SQL Window or through Access Basic's Data Access Objects (DAO) language. These are then converted to a SQL SELECT statement. The query is then compiled — this involves parsing the query (involves syntax checking and determining the columns to query in the database table), then converting into an internal Jet query object format, which is then tokenized and organized into a tree-like structure. In Jet 3.0 onward these are then optimized using the Microsoft Rushmore query optimization technology. The query is then executed and the results passed back to the application or user who requested the data.

Jet passes the data retrieved for the query in a dynaset. This is a set of data that is linked dynamically back to the database. Instead of having the query result stored in a temporary table, where the data cannot be updated directly by the user, the dynaset allows the user to view and update the data contained in the dynaset. Thus, if a university lecturer queries all students who received a distinction in their assignment and finds an error in that student's record, the user would only need to update the data in the dynaset, which would automatically update the student's database record without the need for the user to send a specific update query after storing the query results in a temporary table.

History

[edit]
Jet version Jet engine DLL file name Supported database versions
1.0 ? ? 1.0
1.1 1.10.0001 MSAJT110.DLL
  • 1.0
  • 1.1
2.0 2.00.0000 MSAJT200.DLL
  • 1.0
  • 1.1
  • 2.0
2.5 2.50.1606 MSAJT200.DLL
  • 1.0
  • 1.1
  • 2.0
3.0 3.0.0.2118 MSJT3032.DLL
  • 1.0
  • 1.1
  • 2.0
  • 3.0
3.5 3.51.3328.0 MSJET35.DLL
  • 1.0
  • 1.1
  • 2.0
  • 3.X
4.0 SP8 4.0.8015.0 MSJET40.DLL
  • 1.0
  • 1.1
  • 2.0
  • 3.X
  • 4.0
ACE 12 12.0.xxxx.xxxx ACECORE.DLL
  • 1.0
  • 1.1
  • 2.0
  • 3.X
  • 4.0
  • ACE
ACE 14 14.0.xxxx.xxxx ACECORE.DLL
  • 3.X
  • 4.0
  • ACE
ACE 15 15.0.xxxx.xxxx ACECORE.DLL
  • 4.0
  • ACE
ACE 16 16.0.xxxx.xxxx ACECORE.DLL
  • 4.0
  • ACE
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 Service Pack 2.5
  • Microsoft Access 95
  • Excel 95
3.0
3.5
Microsoft Access 2000 4.0 SP1
Microsoft Access 2002 [4]
Microsoft Access 2003 [5]
Microsoft Access 2007 ACE 12
Microsoft Access 2010 ACE 14
Microsoft Access 2013 ACE 15
Microsoft Access 2016 ACE 16
Visual Basic 3.0 1.1
Visual Basic Compatibility Layer 2.0
Visual Basic 4.0 16-bit 2.5
Visual Basic 4.0 32-bit 3.0
Visual Basic 5.0 3.5
Visual C++ 4.X 3.0
Visual C++ 5.0 3.5
3.0
Internet Information Server 3.0 3.5
SQL Server 7.0 4.0
Redistributable installers
Jet 3.51 web download 3.5+
MDAC 2.1 4.0 SP1
MDAC 2.5 4.0 SP3 to SP6+
Jet 4.0 4.0 SP3 to SP8
2007 Office System Driver ACE 12
Microsoft Access Database Engine 2010 ACE 14
Microsoft Access Database Engine 2013 ACE 15
Microsoft Access Database Engine 2016 ACE 16
Operating systems
Windows Me 4.0 SP3
Windows 2000 4.0 SP3
Windows XP 4.0 SP5+
Windows Server 2003 4.0 SP6+
Windows Vista 4.0 SP8+
Windows Server 2008 4.0 SP8+
Windows 7 4.0 SP8+

Jet originally started in 1992 as an underlying data access technology that came from a Microsoft internal database product development project, code-named Cirrus. Cirrus was developed from a pre-release version of Visual Basic code and was used as the database engine of Microsoft Access. Tony Goodhew, who worked for Microsoft at the time, says

"It would be reasonably accurate to say that up until that stage Jet was more the name of the team that was assigned to work on the DB engine modules of Access rather than a component team. For VB [Visual Basic] 3.0 they basically had to tear it out of Access and graft it onto VB. That's why they've had all those Jet/ODBC problems in VB 3.0."

Jet became more componentized when Access 2.0 was released because the Access ODBC developers used parts of the Jet code to produce the ODBC driver. A retrofit was provided that allowed Visual Basic 3.0 users to use the updated Jet issued in Access 2.0.[6]

Jet 2.0 was released as several dynamic linked libraries (DLL's) that were utilized by application software, such as Microsoft's Access database. DLL's in Windows are "libraries" of common code that can be used by more than one application—by keeping code that more than one application uses under a common library which each of these applications can use independently code maintenance is reduced and the functionality of applications increases, with less development effort. Jet 2.0 comprised three DLL's: the Jet DLL, the Data Access Objects (DAO) DLL and several external ISAM DLL's. The Jet DLL determined what sort of database it was accessing, and how to perform what was requested of it. If the data source was an MDB file (a Microsoft Access format) then it would directly read and write the data to the file. If the data source was external, then it would call on the correct ODBC driver to perform its request. The DAO DLL was a component that programmers could use to interface with the Jet engine, and was mainly used by Visual Basic and Access Basic programmers. The ISAM DLL's were a set of modules that allowed Jet to access three ISAM based databases: xBase, Paradox and Btrieve.[2] Jet 2.0 was replaced with Jet 2.1, which used the same database structure but different locking strategies, making it incompatible with Jet 2.0.

Jet 3.0 included many enhancements, including a new index structure that reduced storage size and the time that was taken to create indices that were highly duplicated, the removal of read locks on index pages, a new mechanism for page reuse, a new compacting method for which compacting the database resulted in the indices being stored in a clustered-index format, a new page allocation mechanism to improve Jet's read-ahead capabilities, improved delete operations that sped up processing, multi-threading (three threads were used to perform read ahead, write behind, and cache maintenance), implicit transactions (users did not have to instruct the engine to start manually and commit transactions to the database), a new sort engine, long values (such as memos or binary data types) were stored in separate tables, and dynamic buffering (whereby Jet's cache was dynamically allocated at start up and had no limit and which changed from a first in, first out (FIFO) buffer replacement policy to a least recently used (LRU) buffer replacement policy).[7] Jet 3.0 also allowed for database replication. Jet 3.0 was replaced by Jet 3.5, which uses the same database structure, but different locking strategies, making it incompatible with Jet 3.0.

Jet 4.0 gained numerous additional features and enhancements.[3]

  • Unicode character storage support, along with an NT sorting method that was also implemented in the Windows 95 version;
  • Changes to data types to be more like SQL Server's (LongText or Memo; Binary; LongBinary; Date/Time; Real; Float4; IEEESingle; Double; Byte or Tinyint; Integer or Integer synonyms Smallint, Integer2, and Short; LongInteger or LongInteger synonyms Int, Integer, and Counter; Currency or Money; Boolean and GUID); a new decimal data type
  • Memo fields could now be indexed
  • Compressible data types
  • SQL enhancements to make Jet conform more closely to ANSI SQL-92
  • Finer grained security; views support; procedure support
  • Invocation and termination (committing or rolling back) of transactions
  • Enhanced table creation and modification
  • Referential integrity support
  • Connection control (connected users remain connected, but once disconnected they cannot reconnect, and new connections cannot be made. This is useful for database administrators to gain control of the database)
  • A user list, which allows administrators to determine who is connected to the database
  • Record-level locking (previous versions only supported page-locking)
  • Bi-directional replication with MS SQL Server.

Microsoft Access versions from Access 2000 to Access 2010 included an "Upsizing Wizard" which could "upsize" (upgrade) a Jet database to "an equivalent database on SQL Server with the same table structure, data, and many other attributes of the original database". Reports, queries, macros and security were not handled by this tool, meaning that some manual modifications might have been needed if the application was heavily reliant on these Jet features.[8]

A standalone version of the Jet 4 database engine was a component of Microsoft Data Access Components (MDAC), and was included in every version of Windows from Windows 2000 on.[9] The Jet database engine was only 32-bit and did not run natively under 64-bit versions of Windows. This meant that native 64-bit applications (such as the 64-bit versions of SQL Server) could not access data stored in MDB files through ODBC, OLE DB, or any other means, except through intermediate 32-bit software (running in WoW64) that acted as a proxy for the 64-bit client.[10]

With version 2007 onward, Access includes an Office-specific version of Jet, initially called the Office Access Connectivity Engine (ACE), but which is now called the Access Database Engine (However MS-Access consultants and VBA developers who specialize in MS-Access are more likely to refer to it as "the ACE Database Engine").[citation needed] This engine was backward-compatible with previous versions of the Jet engine, so it could read and write (.mdb) files from earlier Access versions. It introduced a new default file format, (.accdb), that brought several improvements to Access, including complex data types such as multi-value fields, the attachment data type and history tracking in memo fields. It also brought security changes and encryption improvements and enabled integration with Microsoft Windows SharePoint Services 3.0 and Microsoft Office Outlook 2007.[11][12][13] It can be obtained separately.[14]

The engine in Microsoft Access 2010 discontinued support for Access 1.0, Access 2.0, Lotus 1-2-3 and Paradox files.[15] A 64-bit version of Access 2010 and its ACE Driver/Provider was introduced, which in essence provides a 64-bit version of Jet. The driver is not part of the Windows operating system, but is available as a redistributable.[16][17]

The engine in Microsoft Access 2013 discontinued support for Access 95, Access 97 and xBase files, and it also discontinued support for replication.[18]

Version 1608 of Microsoft Access 2016 restored support for xBase files,[19] and Version 1703 introduced a Large Number data type.[20]

From a data access technology standpoint, Jet is considered a deprecated technology by Microsoft,[21] but Microsoft continues to support ACE as part of Microsoft Access.

Compatibility

[edit]

Microsoft provides the JET drivers for Microsoft Windows only and third party software support for JET databases is almost exclusively found on Windows. However, there are open source projects that enable working with JET databases on other platforms including Linux. Notably, MDB Tools and its much extended Java port named Jackcess as well as UCanAccess.

See also

[edit]

References

[edit]

Further reading

[edit]
Revisions and contributorsEdit on WikipediaRead on Wikipedia
from Grokipedia
The Access Database Engine (ACE), also known as the Office Access Connectivity Engine, is a Microsoft-developed that facilitates data connectivity and management for databases and other file formats, serving as the core technology underlying applications. It provides ODBC and drivers to enable seamless data transfer between files—such as Access (.mdb and .accdb), Excel (.xls, .xlsx, .xlsb, .xlsm), and text files—and non-Office applications or data sources like SQL Server. Introduced as a successor to the original Jet database engine in 2007 with version 12.0, ACE builds on Jet's foundation while adhering to modern Office principles for improved , compatibility, and support in both 32-bit and 64-bit environments. Originally rooted in the debuted alongside in 1992, the Access Database Engine evolved to address limitations in earlier versions, such as the lack of 64-bit support in Jet, making it suitable for contemporary desktop database solutions. Key features include robust querying capabilities, locking mechanisms for multi-user access, and integration with the Access Runtime, which allows developers to distribute applications without requiring a full Access installation. The engine's redistributable package, such as the 2016 version (extended support ended October 14, 2025), ensures broad deployment on supported Windows operating systems, including through 11 and various Server editions, while prohibiting side-by-side installations with conflicting versions to maintain stability. Although optimized for ecosystems, ACE is not intended for high-volume server scenarios previously handled by Jet, emphasizing its role in client-side data manipulation and hybrid connectivity.

Overview

Definition and Components

The Access Database Engine (ACE), successor to the Jet Database Engine, is a file-based engine developed by . Introduced as Jet in 1992, it evolved into the successor with the release of Access 2007, incorporating enhancements for better performance and data handling. This engine serves as the foundational backend for , a desktop database , enabling efficient storage, retrieval, and manipulation of in standalone applications without the need for a dedicated client-server . The primary purpose of the Access Database Engine is to provide a lightweight, solution for small- to medium-scale in Windows environments, supporting relational data models through SQL-based operations. It facilitates direct file I/O for proprietary formats like .mdb and .accdb, allowing developers to build data-driven applications that integrate seamlessly with tools. Database files managed by the engine have a size limit of up to 2 GB, including all objects and data, though this was expanded from 1 GB in pre-2000 legacy .mdb formats to the current 2 GB limit in later .mdb and the newer .accdb format introduced in 2007. Key components of the Access Database Engine include low-level drivers responsible for file input/output operations on Access database files. It also encompasses Data Access Objects (DAO), an object-oriented interface for programmatic manipulation of database structures and data. For broader interoperability, the engine provides an ODBC driver that enables standardized connectivity to Access databases from external applications. At its core, the engine itself handles SQL parsing, query execution, and data processing, ensuring relational integrity and efficient operations within the file-based architecture.

Core Features

The Access Database Engine implements the , enabling the creation and management of tables to store structured , the establishment of relationships such as one-to-many or many-to-many between tables to maintain , the construction of indexes to optimize and sorting, and the use of queries as virtual views for presenting subsets of without duplicating storage. Its query language adheres to a subset of the ANSI SQL-89 standard (Level 1 compliance), supporting fundamental (DML) operations including SELECT for retrieving data, INSERT for adding records, UPDATE for modifying existing data, and DELETE for removing records, while incorporating Access-specific extensions such as domain aggregate functions (e.g., DSum, DCount) and parameter queries for dynamic execution. The engine employs Rushmore query optimization technology, originally integrated from Jet 2.0 onward, which rapidly evaluates search criteria against indexes to filter records without full table scans, significantly enhancing for indexed field queries on local or sources. In multi-user scenarios, the engine supports up to 255 concurrent users accessing a shared database file over a network, utilizing file-level locking mechanisms to coordinate read and write operations while preventing . Unicode support, introduced with Jet 4.0 in late 1998 (deployed in Access 2000 the following year), allows the engine to store and process international character sets using two-byte encoding, replacing prior ANSI limitations and enabling global data handling without character loss. This feature extends to compatibility modes for legacy databases while providing native Unicode storage in newer formats. The engine's design facilitates integration with the Microsoft Office suite, allowing seamless data exchange and application development for desktop productivity environments.

Architecture

Data Storage and Formats

The Access Database Engine utilizes a file-based architecture, where complete databases are contained within individual files for portability and self-containment. During the Jet engine era, the .mdb format served as the primary storage mechanism, employing a binary structure divided into fixed-size pages of 4 KB to manage data allocation and access efficiently. This format supported a maximum database size of 2 GB, encompassing all objects and data while reserving space for system overhead. With the shift to the Access Connectivity Engine (ACE) in 2007, the .accdb format was introduced as the default, preserving the 2 GB size limit but incorporating enhancements for modern features. Notably, .accdb leverages an XML-based schema to enable better compression of attachments and support for multi-value fields, where multiple values per record are represented in a structured XML format within the field, thereby improving extensibility and reducing storage overhead compared to the rigid binary layout of .mdb. This XML integration also facilitates stronger encryption options via the Windows Crypto API. At the core of both formats lies a unified internal organization: databases as monolithic files housing user tables, each with data records and indexes for rapid lookups and ordering. Metadata is maintained in dedicated system catalogs, such as the MSysObjects table, which tracks details on tables, queries, and other objects. For resource-intensive tasks like sorting large datasets, the engine generates temporary files—typically named JET*.tmp—in the system's Temp directory to hold intermediate results without bloating the primary database file.

Concurrency Control

The Access Database Engine manages concurrent access to shared database files primarily through record-level locking, which has been the default mode since the introduction of Jet 4.0 in Access 2000, replacing the coarser page-level locking of prior versions. In record-level locking, only the individual record being edited is locked, enabling finer-grained concurrency compared to page-level locking, where an entire 4 KB page containing multiple records is locked, potentially blocking access to unrelated data. This mechanism uses auxiliary lock files—.ldb for .mdb files and .laccdb for .accdb files—to coordinate access among users; these files record which records or pages are locked and by which users or sessions, preventing write conflicts in multi-user environments while supporting up to 255 concurrent users. Locking modes in the engine include both pessimistic and optimistic approaches to handle write intents. Pessimistic locking acquires an exclusive lock on a record as soon as a user begins editing it, ensuring no other user can modify the same record until the changes are committed or the edit is canceled; this mode is ideal for scenarios with high conflict potential, such as inventory management systems. In contrast, optimistic locking permits multiple users to read and edit copies of the same record simultaneously without immediate locking, but verifies for changes upon commit—if another user's update has occurred meanwhile, the operation fails with an error, requiring manual resolution. These modes apply at the recordset level via properties like LockEdits in or adLockPessimistic/adLockOptimistic in ADO, and integrate with transaction boundaries to scope locks appropriately during commits or rollbacks. Under high contention, the engine may escalate individual record locks to table-level locks to optimize performance and reduce overhead, particularly when many records in a table are affected. Lock files facilitate this by maintaining shared or exclusive table locks, which control overall access modes for reading or writing. The system supports a configurable maximum of locks per file via the MaxLocksPerFile registry setting (default 9,500, adjustable up to DWORD limits for larger workloads), beyond which operations fail with errors prompting increases. Deadlocks, arising from circular wait conditions on locks, are detected automatically by the engine, which resolves them by rolling back the affected session showing the least progress to minimize disruption.

Transaction Processing

The Access Database Engine provides support for transaction processing to ensure reliable, atomic operations across multiple data changes, adhering to the ACID properties of atomicity, consistency, isolation, and durability. Atomicity is achieved by grouping operations into explicit transactions using the DAO Workspace methods BeginTrans, CommitTrans, and Rollback, where all changes within a transaction are applied as a single unit or none at all; this mechanism replaced implicit transactions introduced in Jet 3.0, which automatically wrapped SQL data manipulation language (DML) statements but were removed in Jet 3.5 to improve performance by reducing overhead for single-statement operations. Consistency is maintained through the Rollback method, which undoes all changes if an error occurs or the transaction is explicitly canceled, reverting the database to its pre-transaction state. Isolation is provided by integrating transaction boundaries with the engine's locking system, preventing concurrent modifications from interfering with uncommitted changes during a transaction's execution. Durability is achieved through the commit process, ensuring changes are persisted to the database file, though it is not as robust as in server-based systems with transaction logs and may depend on the underlying file system's reliability, particularly in networked environments. Transactions in the engine are managed at the Workspace level in or Connection level in ADO, encompassing all databases and recordsets within that scope, but nested transactions are not supported—subsequent BeginTrans calls are invalid until the current transaction is committed or rolled back. Developers must explicitly invoke these methods to delimit transactions, as the engine does not support savepoints or partial rollbacks within a transaction. For example, in , a typical sequence begins with Workspace.BeginTrans, executes multiple updates or inserts via Recordset or QueryDef objects, and concludes with CommitTrans for persistence or for cancellation. In ADO, the equivalent uses Connection.BeginTrans, followed by command executions and CommitTrans or RollbackTrans. This explicit control is essential for maintaining in multi-step operations, such as batch updates across related tables. In the Jet era, implicit transactions in versions 3.0 and earlier automatically ensured atomicity for SQL DML batches by rolling back the entire batch on failure, but Jet 3.5's removal of this feature shifted responsibility to developers for wrapping operations explicitly, enhancing throughput for simple queries while requiring careful management for complex ones. The ACE engine, introduced in , retains this explicit model. This approach prioritizes simplicity for desktop applications but limits scalability compared to server-based engines with persistent transaction logs.

Data Integrity

The Access Database Engine enforces entity integrity through primary keys and unique indexes, ensuring that each record in a table is uniquely identifiable and preventing duplicate entries in key fields. A , which can consist of one or more fields, requires unique, non-null values and serves as the foundation for relationships between tables. Unique indexes achieve similar uniqueness but permit null values in the indexed fields, providing flexibility for optional while maintaining consistency. For example, an AutoNumber , commonly used for primary keys, automatically generates sequential or random unique identifiers to avoid manual entry errors and ensure non-null values. Referential integrity is maintained via foreign keys that reference s or unique indexes in related tables, preventing orphaned records and ensuring valid associations across tables. When enforcing referential integrity, foreign key values must match an existing value or be null to allow unrelated records; unmatched values are rejected during inserts or updates. Cascade options enhance this by automatically propagating changes: cascade update related fields adjusts foreign keys when the referenced changes (except for AutoNumber fields, which cannot be updated), while cascade delete related records removes dependent records upon deletion of the primary record, with user warnings for direct deletions but none for query-based ones. These mechanisms require compatible data types between primary and foreign keys, such as AutoNumber paired with Long Integer. Required fields, marked via the Required property, further enforce non-null values at the field level during inserts and updates. Check constraints and validation rules provide domain integrity by restricting values at the field or table level, allowing custom expressions to validate against business requirements. Field-level validation rules, set in table design, apply to individual columns (e.g., ensuring a field is greater than zero with >0), while table-level rules can reference multiple fields or even subqueries for complex checks (e.g., verifying a customer's against a ). These rules, limited to 64 characters in expressions, trigger errors on violation during . For more advanced business rules, (VBA) code can be embedded in form events, such as the BeforeUpdate event, to perform procedural validations like checking if a is supplied before saving a record. Null values are handled explicitly to support optional data: foreign keys allow nulls to denote no relationship, while primary keys and required fields prohibit them to uphold integrity. These constraints are evaluated during data insertion and updates, with final enforcement occurring during transaction commits to maintain a valid database state.

Security Mechanisms

The Access Database Engine incorporates user-level security via workgroup information files (.mdw), which store definitions for users, groups, and granular permissions including read, write, and administrative access to database objects. This mechanism allows administrators to enforce role-based access control within secured environments, particularly for legacy .mdb databases. Although user-level security originated in the Jet engine era, it has been deprecated in the ACE engine for modern file formats like .accdb, with support limited to backward-compatible operation on unconverted .mdb files. Database password encryption provides an additional layer of protection, employing basic obfuscation in .mdb files and AES-128 encryption in .accdb files to safeguard against unauthorized file access. Since the Jet 4.0 release, the engine has supported SQL GRANT and REVOKE statements, enabling programmatic assignment and revocation of permissions on database objects such as tables and views. For .accdb databases, integration with Windows authentication is available through linked tables to external sources like SQL Server, leveraging the current user's Windows credentials for secure data access without storing separate logins. At the file level, the engine employs bit-locking via lock files (.ldb for .mdb, .laccdb for .accdb), which use bit vectors to track and prevent unauthorized concurrent modifications to records or pages. This mechanism integrates with concurrency controls to maintain data consistency during multi-user sessions.

Query Processing

The Access Database Engine processes SQL queries through a multi-stage pipeline that begins with the input SQL statement into an internal representation suitable for further analysis and execution. This phase validates the and semantics of the query against the engine's supported of SQL, converting the statement into a structured form that facilitates optimization and code generation. For instance, the engine supports subqueries, joins involving up to 32 tables, and aggregate functions such as SUM, AVG, , MIN, and MAX, which are parsed to enable complex and summarization. Following parsing, the engine generates an execution plan, which outlines the steps for retrieving and processing data. This plan is stored temporarily in memory during query execution and can be analyzed using tools like JetShowPlan to reveal details such as table scans, index usage, and join operations. The resulting recordsets can be configured as dynasets, which provide dynamic, updatable views that reflect changes in the underlying data through bookmarks tied to primary keys, or snapshots, which offer static, read-only copies of the data for faster access but without real-time updates. Dynasets are particularly useful for scenarios requiring editable query results, while snapshots minimize network traffic in remote data environments by fetching complete records upfront. Query optimization in the Access Database Engine leverages the Rushmore technology, introduced in Jet 2.0 and carried forward in , to accelerate filtering and joining operations by exploiting existing indexes on tables. Rushmore evaluates query criteria against index structures to identify qualifying record subsets without scanning entire tables, applying set operations like and union to combine results from multiple indexed fields; for example, a query filtering on both customer ID and date range can use compound indexes to reduce I/O significantly. Join-order heuristics further refine the plan by estimating costs based on table sizes and index availability, prioritizing efficient execution paths. The engine briefly references indexes defined in the layer to inform these decisions, ensuring optimizations align with physical data organization. By default, queries are subject to a 60-second timeout to prevent indefinite hangs, particularly when accessing ODBC-linked sources. For queries targeting external management systems (RDBMS) via ODBC, the engine supports pass-through mode, where the SQL statement is forwarded directly to the remote server for parsing, optimization, and execution, bypassing local processing. This approach leverages the remote system's capabilities for complex operations, returning only the results to the Access Database Engine, which is ideal for linked tables in heterogeneous environments.

Development Interfaces

Data Access Objects (DAO)

Data Access Objects (DAO) serves as the primary Component Object Model (COM)-based application programming interface (API) for the Access Database Engine, enabling developers to create, manipulate, and manage databases, tables, queries, and recordsets programmatically. Introduced as a native interface tightly integrated with the engine, DAO provides object-oriented access to engine features without relying on external standards, making it suitable for applications built directly on Access file formats like .mdb and .accdb. At the core of the DAO hierarchy is the DBEngine object, which acts as the top-level controller for all other DAO objects, managing a single instance that oversees Workspace objects, databases, and error handling. A Database object, created or opened via methods like DBEngine.CreateDatabase or DBEngine.OpenDatabase, represents an open database and contains collections of TableDef objects for table structures, QueryDef objects for saved queries, and Recordset objects for data navigation and editing. Key methods on the Database object include Execute, which runs SQL action queries such as INSERT, UPDATE, or DELETE without returning records, and OpenRecordset, which generates a Recordset from a table, query, or SQL statement for reading or modifying data. This structure allows for efficient in-process operations, contrasting with ODBC's focus on external data source connectivity. DAO version 3.6, released with 2000, provided improved support for Jet 4.0 features including , and remains compatible with ADO for data access in Access applications. It remains the preferred interface for leveraging Access-specific features, such as the attachment in .accdb files, where Recordset objects can directly handle multi-valued Attachment fields to add, save, or extract files like images or documents. Error handling in DAO utilizes the Errors collection on the DBEngine object, which populates with Error objects containing engine-specific details like error numbers, descriptions, and sources following operations that fail, such as invalid SQL or constraint violations. Developers iterate through this collection to retrieve multiple errors from a single event, enabling precise diagnosis and recovery tailored to the Access Database Engine's behavior.

ActiveX Data Objects (ADO) and ODBC

ActiveX Data Objects (ADO) serves as a higher-level programmatic interface that consumes providers to interact with the Access Database Engine, enabling developers to manage data through objects such as Connection for establishing database links, Command for executing queries and actions, and Recordset for handling result sets. ADO facilitates disconnected operations by allowing Recordset objects to be opened with a client-side cursor location (adUseClient), after which the ActiveConnection property can be set to Nothing to detach the Recordset from the data source, permitting offline manipulation of data without maintaining an active connection. Additionally, ADO supports XML persistence for Recordsets via the Save method with the adPersistXML format, which serializes the data into XML for storage in files or streams, and the Open method to reload it later. The (ODBC) driver for the Access Database Engine, known as the Microsoft Access Driver (*.mdb, *.accdb), complies with ODBC version 3.51 and later specifications, allowing applications to link to external data sources and expose Access files through Data Source Names (DSNs) configured in the ODBC Data Source Administrator. This driver supports various cursor types, including forward-only for sequential read access and keyset-driven for maintaining row identifiers while detecting updates, enabling efficient navigation and concurrency handling in ODBC-compliant applications. The ACE ODBC driver has provided 64-bit support since its introduction with Office 2010, allowing connectivity on modern 64-bit Windows systems. However, Microsoft does not officially support mixing 32-bit and 64-bit versions of the Access Database Engine on the same machine, as Office updates could conflict with or override the redistributable, requiring only one architecture to be installed per machine to avoid such conflicts. A notable limitation is the absence of support for stored procedures in native mode, as the Access Database Engine relies on queries and macros for logic rather than procedural code, restricting ODBC interactions to SQL statements without callable routines. For applications requiring both Access-specific features and standardized access, ADO and ODBC can be used alongside Data Access Objects (DAO) in hybrid scenarios. Developers often switch between OLE DB providers like the legacy Jet.OLEDB.4.0 for older .mdb files and the current for .accdb files and enhanced functionality, ensuring compatibility with evolving file formats.

History and Evolution

Jet Engine Era (1992–2006)

The Jet Engine Era commenced with the release of version 1.0 in November 1992, bundled with 1.0, marking the debut of this database engine as a modular system for data manipulation. This initial iteration supported legacy file formats such as and through integrated ISAM drivers, alongside basic for querying and structuring relational data. Subsequent evolution addressed growing demands for interoperability and performance. Jet 2.0 arrived in December 1994 with Access 2.0, introducing ODBC compliance to facilitate connections with external databases and expand data access beyond native formats. By October 1995, Jet 3.0—paired with Access 95—incorporated Rushmore query optimization, a technique derived from FoxPro that accelerated search and filtering operations by leveraging indexes efficiently. It also added the long integer data type (INTEGER), enabling storage of 32-bit signed values ranging from -2,147,483,648 to 2,147,483,647 for more robust numeric handling. In 1997, Jet 3.5 accompanied Access 97 and extended replication capabilities, allowing databases to create synchronized replicas for distributed environments while maintaining data consistency across multiple users or locations. The era culminated with Jet 4.0 in late 1998 alongside Access 2000, which implemented full storage for text fields to support multilingual applications and introduced SQL-driven security mechanisms, including commands such as CREATE USER, ALTER USER, and DROP GROUP for granular . Jet 4.0 received ongoing refinements through service packs, with SP8—deployed progressively from 2000 to 2006—serving as the final major update of the era, resolving Y2K-related date handling vulnerabilities and incorporating support for XML data export to enable integration with web and structured document workflows. Although the replication engine enhanced collaborative scenarios during this period, it was later deprecated as the engine transitioned toward modern architectures.

ACE Engine Era (2007–Present)

The Access Database Engine, rebranded as the (Access Connectivity Engine), debuted with version 12.0 in January 2007 as part of and Access 2007. This release marked a significant evolution from the prior , introducing the .accdb as the default for new databases, which supported advanced features like multi-value fields allowing multiple entries in a single field (e.g., assigning multiple categories to a product record) and attachment fields for embedding files. Additionally, 12.0 implemented AES () encryption for database passwords, leveraging 128-bit keys via the Windows Crypto API to enhance security over previous methods. The engine maintained backward compatibility with legacy .mdb files from Jet-based versions, enabling seamless migration for existing applications. Subsequent versions built on this foundation with targeted enhancements. ACE 14.0, released in July 2010 with Access 2010, added native 64-bit support, allowing the engine to leverage larger memory addressing for improved performance in data-intensive operations on 64-bit Windows systems. In 2013, ACE 15.0 accompanied Access 2013 and fully removed support for database replication, a legacy feature from earlier Jet eras, while also discontinuing compatibility with Access 95, Access 97, and certain file formats due to outdated drivers. ACE 16.0 arrived in September 2015 with Access 2016, restoring support for files (such as and ) through updated drivers, enabling renewed interoperability with older legacy systems. Updates continued through subscriptions and standalone releases, including Access 2021 (October 2021) and Access 2024 (October 2024), with the engine evolving via cumulative security and stability patches. The 2016 redistributable (version 16.0) reached the end of extended support on October 14, 2025, meaning no further updates or for that specific package, though core functionality remains operational on supported Windows versions. However, continued delivering updates to the ACE engine within Access 2024 and the Access Runtime for , ensuring ongoing compatibility and fixes for subscribers beyond this date. Recent developments since Access 2021 have emphasized enhanced 64-bit performance optimizations, such as better memory management for large datasets, and improved support for cloud-linked tables, including streamlined relinking to external sources like lists via the updated Linked Table Manager. These advancements facilitate hybrid on-premises and cloud workflows without requiring full database migration.

Compatibility and Limitations

Platform and Version Compatibility

The Access Database Engine provides native support for Windows operating systems. Recent versions, such as the Access Database Engine 2016, are compatible with SP1 and later, including , , and corresponding Windows Server editions; older versions, like the 2010 redistributable, supported . The extended support for the Microsoft Access Database Engine 2016 ended on October 14, 2025. There is no official support for macOS or platforms from , though third-party tools such as Jackcess, a pure library for reading and writing Access databases, and MDB Tools, a set of utilities for extracting data from Access files on systems, enable cross-platform access to .mdb and .accdb files. Regarding bitness compatibility, the engine maintains legacy 32-bit support from earlier Jet versions, while 64-bit capability was introduced with the Access Database Engine (ACE 14.0), allowing deployment in both architectures. Mixed-mode environments, where 32-bit and 64-bit applications coexist, often require separate runtime installations to avoid conflicts, as the engine does not support side-by-side installation of differing bitness versions when is present. Microsoft does not officially support mixing 32-bit and 64-bit installations of the Access Database Engine, particularly when Microsoft Office is installed, as Office updates could conflict with or override the redistributable. File format compatibility ensures backward support, with .mdb files readable across both Jet and engines, facilitating transitions from older Access versions. In contrast, the newer .accdb format, introduced with 12.0 in Access 2007, requires at least that engine version for full read/write operations. Access 2024, the latest edition, is specifically compatible with and Windows 11. Development interface compatibility ties specific versions of Data Access Objects () and ActiveX Data Objects (ADO) to the underlying engine; for instance, DAO 3.6 is associated with Jet 4.0, used in Access 2000 through 2003, while later ACE versions utilize updated libraries like the Microsoft Office 14.0 Access Database Engine Object Library. This linkage ensures that applications developed against older engines may require runtime updates for with newer platforms.

Interoperability and Constraints

The Access Database Engine supports interoperability with external data sources through linked tables, enabling seamless connections to systems like SQL Server and Excel spreadsheets using ODBC and providers. For instance, users can link Access tables directly to SQL Server databases via the SQL Server ODBC driver or the Microsoft Provider for SQL Server, allowing read-write access to remote data without importing it into the local file. Similarly, linking to Excel files is facilitated through the Microsoft Excel ODBC driver, which treats worksheets as external tables for querying and updating data in Access applications. These connections leverage the engine's built-in support for ODBC and standards to facilitate hybrid environments where Access serves as a front-end to more robust back-ends. Conversely, SQL Server can be configured to link to Access databases using the Microsoft ACE OLE DB Provider, enabling bidirectional interoperability. In SQL Server Management Studio (SSMS), this involves expanding Server Objects > Linked Servers > Providers, right-clicking Microsoft.ACE.OLEDB.16.0 (or 12.0), and selecting Properties. Enable Allow inprocess for improved performance and to avoid errors, Dynamic parameters, Nested queries, and Supports 'Like' operator; optionally enable Level zero only; then click OK. This configuration resolves common errors such as "Cannot initialize the data source object". Data exchange is further enhanced by built-in export and import capabilities to common formats such as XML and CSV. Access can export tables or query results to XML files, preserving structure and relationships for integration with web services or other XML-compatible systems, while imports from XML allow mapping elements to tables during the process. CSV support enables straightforward bulk transfers, with the engine handling delimited text files for both importing raw data into new tables and exporting for analysis in tools like Excel. Additionally, the engine historically supported integration with lists through linked tables, treating them as external ODBC sources for synchronizing data between Access and collaborative environments; however, broader Access Services for web-based apps, including certain integrations, were deprecated after the release, limiting advanced web database features. Key constraints of the Access Database Engine stem from its file-based architecture, which lacks native client-server capabilities and relies on shared file access limited to local area networks (LANs). This design supports up to 255 concurrent users in theory but performs reliably only for small workgroups, as file-locking mechanisms can lead to conflicts and reduced over wide area networks (WANs) or connections. The engine enforces a strict 2 GB maximum for .accdb databases, excluding overhead for system objects, which can constrain applications with large datasets unless mitigated by linking to external sources. Performance limitations are exacerbated by single-file I/O operations, resulting in contention and slowdowns when more than 10 users access the database simultaneously, particularly during writes or complex queries. In 32-bit mode, the engine exhibits poor multi-threading support, often crashing or blocking in scenarios with concurrent connections from multiple threads, as the ACE provider is not designed for parallel execution. Legacy security features, such as user-level security, were deprecated in favor of simpler database passwords, introducing risks for compliance with regulations like GDPR due to insufficient granular access controls and audit logging in modern contexts. The provides no native support for mobile or synchronization, requiring workarounds such as migrating to via the Access connector for Power Platform to enable apps with offline capabilities and real-time sync in 2025 deployments. For scaling beyond these constraints, recommends alternatives like , a free edition that offers true client-server , unlimited concurrent users, and better multi-user performance when linked from Access front-ends.

References

Add your contribution
Related Hubs
Contribute something
User Avatar
No comments yet.