Recommended Reading

Top  Previous  Next

 

What is Opportunistic Locking?

Opportunistic locking is a Windows-specific mechanism for client/server databases to allow multiple processes to lock the same file while allowing for local (client) data caching to improve performance over Windows networks. Unfortunately, the default setting of the opportunistic locking mechanism that enhances the performance of one type of database also introduces data integrity issues for other database types.

Microsoft's documentation states "An opportunistic lock (also called an oplock) is a lock placed by a client on a file residing on a server. In most cases, a client requests an opportunistic lock so it can cache data locally, thus reducing network traffic and improving apparent response time. Opportunistic locks are used by network redirectors on clients with remote servers, as well as by client applications on local servers" and "Opportunistic locks are requests from the client to the server. From the point of view of the client, they are opportunistic. In other words, the server grants such locks whenever other factors make the locks possible.".

You can read more about opportunistic locking in Microsoft's documentation. Please see the Additional Reading section for more information.

 

What is Read Caching?

Read caching is local caching of read data, sometimes referred to as read-ahead caching, on client (workstation) PCs. This type of caching is the default behavior of the Windows operating system to improve performance of client/server databases over Windows networks. The way it works is that workstations can read data from the server and keep a local copy of that data to reduce network traffic. As soon as that workstation writes any data, it should flush file buffers at that time, reread the data from the server and then commit the changes.

Problems with read caching usually occur if something unforeseen happens, such as a workstation crash, where data is not properly flushed from the workstation, which can lead to data corruption.

Microsoft's documentation states that "Under extreme conditions, some multi user database applications that use a common data store over a network connection on a file server may experience transactional integrity issues or corruption of the database files and/or indexes stored on the server. This typically applies to some so-called "ISAM style", or "record oriented" multi user database applications, not to a client/server relational system like SQL Server." and "A hazard of local caching is that written data only has as much integrity as the client itself for as long as the data is cached on the client. In general, locally cached data should be flushed to the server as soon as possible."

 

Disabling Read Caching on Windows Workstations

All Windows operating systems in the 9X family that act as database clients for ISAM data files (meaning that they access ISAM data files stored on other Windows PCs) need to have read caching disabled in order to minimize the chances of database corruption. This includes Windows 98 and Windows ME.

The Windows registry entry that controls read caching on Windows network clients is:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\VxD\VREDIR

DiscardCacheOnOpen REG_BINARY 0 or 1

Default: 0 (not disabled)

To disable read caching, the value of DiscardCacheOnOpen must be set to 1.

You can verify (or change or add, if necessary) this Registry value using the Windows Registry Editor (regedit.exe).

If you do change this Registry value, you will have to reboot the PC to ensure that the new setting goes into effect.

Please read the Microsoft disclaimer regarding editing of the Windows registry here.

STEPS:

1. Start > Run > Regedit.exe

2. Click on the + (plus sign) next to HKey_Local_Machine

3. Click on the + (plus sign) next to System

4. Click on the + (plus sign) next to CurrentControlSet

5. Click on the + (plus sign) next to Services

6. Click on the + (plus sign) next to VxD

7. Click on the VREDIR entry on the left-hand side of Registry Editor

8. If the DiscardCacheOnOpen registry value already exists (on the right-hand side of Registry Editor), ensure that its value is 1

9. If the DiscardCacheOnOpen value already exists but its value is not 1, double-click on DiscardCacheOnOpen to change its value to 1

10. If the DiscardCacheOnOpen entry does not exist, right-click in the white space of the right-hand side of Registry Editor

11. Select New > Binary value

12. Rename the value to DiscardCacheOnOpen

13. Double-click on DiscardCacheOnOpen to change its value to 1

 

Disabling Opportunistic Locking on Windows Servers

All Windows operating systems in the NT family that act as database servers for ISAM data files (meaning that ISAM data files are stored there and accessed by other Windows PCs) need to have opportunistic locking disabled in order to minimize the chances of database corruption. This includes Windows NT, Windows 2000, Windows XP and Windows 2003 Server.

There are 2 Windows registry entries that control opportunistic locking (oplocks) on Windows network servers:

1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters EnableOpLockForceClose

2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters EnableOplocks

1. EnableOpLockForceClose

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

EnableOpLockForceClose REG_DWORD 0 or 1

Default: 0 (not disabled)

To disable oplocks, the value of EnableOpLockForceClose must be set to 1.

You can verify (or change or add, if necessary) this Registry value using the Windows Registry Editor (regedit.exe).

If you do change this Registry value, you will have to reboot the PC to ensure that the new setting goes into effect.

Please read the Microsoft disclaimer regarding editing of the Windows registry here.

STEPS:

1. Start > Run > Regedit.exe

2. Click on the + (plus sign) next to HKey_Local_Machine

3. Click on the + (plus sign) next to System

4. Click on the + (plus sign) next to CurrentControlSet

5. Click on the + (plus sign) next to Services

6. Click on the + (plus sign) next to LanManServer

7. Click on the Parameters entry on the left-hand side of Registry Editor

8. If the EnableOpLockForceClose registry value already exists (on the right-hand side of Registry Editor), ensure that its value is 1

9. If the EnableOpLockForceClose value already exists but its value is not 1, double-click on EnableOpLockForceClose to change its value to 1

10. If the EnableOpLockForceClose entry does not exist, right-click in the white space of the right-hand side of Registry Editor

11. Select New > DWORD value

12. Rename the value to EnableOpLockForceClose

13. Double-click on EnableOpLockForceClose to change its value to 1

2. EnableOplocks

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanServer\Parameters

EnableOplocks REG_DWORD 0 or 1

Default: 1 (true)

To disable oplocks, the value of EnableOplocks must be set to 0.

You can verify (or change or add, if necessary) this Registry value using the Windows Registry Editor (regedit.exe).

If you do change this Registry value, you will have to reboot the PC to ensure that the new setting goes into effect.

Please read the Microsoft disclaimer regarding editing of the Windows registry here.

STEPS:

1. Start > Run > Regedit.exe

2. Click on the + (plus sign) next to HKey_Local_Machine

3. Click on the + (plus sign) next to System

4. Click on the + (plus sign) next to CurrentControlSet

5. Click on the + (plus sign) next to Services

6. Click on the + (plus sign) next to LanManServer

7. Click on the Parameters entry on the left-hand side of Registry Editor

8. If the EnableOplocks registry value already exists (on the right-hand side of Registry Editor), ensure that its value is 0

9. If the EnableOplocks value already exists but its value is not 0, double-click on EnableOplocks to change its value to 0

10. If the EnableOplocks entry does not exist, right-click in the white space of the right-hand side of Registry Editor

11. Select New > DWORD value

12. Rename the value to EnableOplocks

13. Double-click on EnableOplocks to change its value to 0

 

Note: The location of the registry entry for opportunistic locking has changed in Windows 2000 from the earlier location in Microsoft Windows NT. In Windows 2000, the registry entry that disables opportunistic locking is:

HKEY_LOCAL_MACHINE\System\CurrentControlSet\Services\MRXSmb\Parameters\

OplocksDisabled REG_DWORD 0 or 1

Default: 0 (not disabled)

To disable oplocks, the value of OplocksDisabled must be set to 1.

Note: Windows 2000 will still respect the EnableOplocks registry value used to disable oplocks in earlier versions of Windows.

 

Disabling Opportunistic Locking on Windows Workstations

All Windows operating systems in the NT family that act as database servers for ISAM data files (meaning that ISAM data files are stored there and accessed by other Windows PCs) need to have opportunistic locking disabled in order to minimize the chances of database corruption. This includes Windows NT, Windows 2000 and Windows XP.

If you use a Windows NT family workstation in place of a server, you must also disable opportunistic locking (oplocks) on that workstation. For example, if you use a PC with the Windows NT Workstation operating system instead of Windows NT Server, Windows 2000 Professional instead of Windows 2000 Server, or Windows XP Home instead of Windows XP Professional, and you have ISAM data files located on it that are accessed from other Windows PCs, you will need to disable oplocks on that system.

The major difference is the location in the Windows registry where the values for disabling oplocks are entered. Instead of the LanManServer location, the LanManWorkstation location is used here.

There are 2 Windows registry entries that control opportunistic locking (oplocks) on Windows network workstations:

1. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters EnableOpLockForceClose

2. HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters EnableOplocks

1. EnableOpLockForceClose

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanmanWorkstation\Parameters

EnableOpLockForceClose REG_DWORD 0 or 1

Default: 0 (not disabled)

To disable oplocks, the value of EnableOpLockForceClose must be set to 1.

You can verify (or change or add, if necessary) this Registry value using the Windows Registry Editor (regedit.exe).

If you do change this Registry value, you will have to reboot the PC to ensure that the new setting goes into effect.

 

Editing the Windows Registry

Caution: The following warning appears in every Microsoft Knowledge Base article that discusses editing the Windows registry:

WARNING : You can edit the registry by using Registry Editor (Regedit.exe or Regedt32.exe). If you use Registry Editor incorrectly, you can cause serious problems that may require you to reinstall your operating system. Microsoft does not guarantee that problems that you cause by using Registry Editor incorrectly can be resolved. Use Registry Editor at your own risk.

STEPS:

1. Start > Run > Regedit.exe

2. Click on the + (plus sign) next to HKey_Local_Machine

3. Click on the + (plus sign) next to System

4. Click on the + (plus sign) next to CurrentControlSet

5. Click on the + (plus sign) next to Services

6. Click on the + (plus sign) next to LanManWorkstation

7. Click on the Parameters entry on the left-hand side of Registry Editor

8. If the EnableOpLockForceClose registry value already exists (on the right-hand side of Registry Editor), ensure that its value is 1

9. If the EnableOpLockForceClose value already exists but its value is not 1, double-click on EnableOpLockForceClose to change its value to 1

10. If the EnableOpLockForceClose entry does not exist, right-click in the white space of the right-hand side of Registry Editor

11. Select New > DWORD value

12. Rename the value to EnableOpLockForceClose

13. Double-click on EnableOpLockForceClose to change its value to 1

2. EnableOplocks

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\LanManWorkstation\Parameters

EnableOplocks REG_DWORD 0 or 1

Default: 1 (true)

To disable oplocks, the value of EnableOplocks must be set to 0.

You can verify (or change or add, if necessary) this Registry value using the Windows Registry Editor (regedit.exe).

If you do change this Registry value, you will have to reboot the PC to ensure that the new setting goes into effect.

Please read the Microsoft disclaimer regarding editing of the Windows registry here.

STEPS:

1. Start > Run > Regedit.exe

2. Click on the + (plus sign) next to HKey_Local_Machine

3. Click on the + (plus sign) next to System

4. Click on the + (plus sign) next to CurrentControlSet

5. Click on the + (plus sign) next to Services

6. Click on the + (plus sign) next to LanManWorkstation

7. Click on the Parameters entry on the left-hand side of Registry Editor

8. If the EnableOplocks registry value already exists (on the right-hand side of Registry Editor), ensure that its value is 0

9. If the EnableOplocks value already exists but its value is not 0, double-click on EnableOplocks to change its value to 0

10. If the EnableOplocks entry does not exist, right-click in the white space of the right-hand side of Registry Editor

11. Select New > DWORD value

12. Rename the value to EnableOplocks

13. Double-click on EnableOplocks to change its value to 0

 

Persistent Data Corruption

If you have applied all of the settings discussed in this paper but data corruption problems and other symptoms persist, here are some additional things to check out:

We have credible reports from developers that faulty network hardware, such as a single faulty network card, can cause symptoms similar to read caching and data corruption.
If you see persistent data corruption even after repeated reindexing, you may have to rebuild the data files in question. This involves creating a new data file with the same definition as the file to be rebuilt and transferring the data from the old file to the new one. There are several known methods for doing this that can be found in our Knowledge Base.

 

Windows NT4

As far as we know there is no user interface provided to the write-behind caching feature in  Windows NT. Data from Microsoft suggest that you need to ensure that you are using Service Pack  4 or later, and that you need to check the value of the registry entry:

HKEY_LOCAL_MACHINE\SYSTEM\CurrentControlSet\Services\Rdr\Parameters\UseWriteBehind

The value 0 (zero) disables write behind caching. It is not clear what state the system is in if this  key is not present.

 

We do not encourage you to edit the registry. Messing with the registry is not a good idea unless  you are confident that you know what you are doing. Making incorrect registry entries can cause  your Windows operating system, or application programs, to act improperly or stop working. We   make no warranties for the instructions given in the Microsoft article referenced above, or for the  registry entries reproduced on this (or any other) web page. You agree to make any and all  registry changes at your own risk. Consult your local expert!

Summary

We suggest you review all the above material, and consider the advisability of making changes to  your system.

 

Terms

ISAM
Indexed Sequential Access Method is a file management system developed at IBM that allows records to be accessed either sequentially (in the order they were entered) or randomly (with an index).

 

Additional Reading

You may want to check for an updated version of this white paper on our Web site from time to time. Many of our white papers are updated as information changes. For those papers, the Last Edited date is always at the top of the paper.
Section of the Microsoft MSDN Library on opportunistic locking:
Opportunistic Locks, Microsoft Developer Network (MSDN), Windows Development > Windows Base Services > Files and I/O > SDK Documentation > File Storage > File Systems > About File Systems > Opportunistic Locks, Microsoft Corporation.
URL=http://msdn.microsoft.com/library/en-us/fileio/base/opportunistic_locks.asp
Microsoft Knowledge Base Article Q224992 "Maintaining Transactional Integrity with OPLOCKS", Microsoft Corporation, April 1999, URL=http://support.microsoft.com/default.aspx?scid=kb;en-us;Q224992
Microsoft Knowledge Base Article Q296264 "Configuring Opportunistic Locking in Windows 2000", Microsoft Corporation, April 2001, URL=http://support.microsoft.com/default.aspx?scid=kb;en-us;Q296264
Microsoft Knowledge Base Article Q129202 "PC Ext: Explanation of Opportunistic Locking on Windows NT", Microsoft Corporation, April 1995, URL=http://support.microsoft.com/default.aspx?scid=kb;en-us;Q129202