Skip to content

DF_FILE_LOCK_TYPE

See Also: Get_Attribute, Set_Attribute

Specifies the locking type to be used on the table.

Level

Table

Supported by

All Drivers

Type

Enumeration list, permanent

Access

Read / Write

Values

  • DF_LOCK_TYPE_NONE
  • DF_LOCK_TYPE_FILE
  • DF_LOCK_TYPE_RECORD

Remarks

If a table’s DF_FILE_LOCK_TYPE attribute has a value of DF_LOCK_TYPE_NONE, then no locking will be done for it. Using this value causes the value of the DF_FILE_MULTIUSER attribute to be set to DF_FILE_USER_SINGLE. A value of DF_LOCK_TYPE_FILE indicates locking will be done at the table level, and a value of DF_LOCK_TYPE_RECORD indicates that locking will be done at the record level.

Note that setting a table’s lock type to DF_LOCK_TYPE_NONE can result in data corruption. It is only safe to do if the table is never updated (no records are created, updated, or deleted) or the application updating the table is doing so in true single user mode (only one process is accessing the table). Since locking is an expensive operation, this setting was used to tune performance. This is no longer needed for applications that use DataDictionary or DataSet objects. These objects use smart file mode to ensure only those tables that are actually updated are locked.

The DF_FILE_LOCK_NONE attribute value is left over from the time when there were single user/process operating systems. Modern operating systems allow multiple processes to run simultaneously. When two (or more) processes access a table at the same time, they are in fact using the table in a multi-user fashion which requires a form of locking.

For the Embedded Database, the locking type must be set to either DF_LOCK_TYPE_FILE or DF_LOCK_TYPE_NONE. The locking type DF_LOCK_TYPE_NONE can only be used with applications that do not use DataSets or Data Dictionaries.

For Pervasive.SQL, the DF_FILE_LOCK_TYPE attribute cannot be set. It is possible to set the lock type to no locking, table locking, or record locking, but not on a table-by-table basis. The lock type is a global setting for the DataFlex Pervasive.SQL Driver. It can be set using the DFBTR_SET_TRANSACTION_TYPE command. The value returned for the attribute depends on what was passed to the DFBTR_SET_TRANSACTION_TYPE command in the following way:

Pervasive.SQL lock type Attribute value
DFBTRTT_NONE DF_LOCK_TYPE_NONE
DFBTRTT_EXCLUSIVE DF_LOCK_TYPE_FILE
DFBTRTT_CONCURRENT DF_LOCK_TYPE_RECORD

For tables accessed through the DataFlex SQL Drivers, an attempt to set the DF_FILE_LOCK_TYPE attribute will be ignored. It will always return the value DF_LOCK_TYPE_RECORD.

This attribute can only be set inside a Structure_Start ... Structure_End operation. We expect this attribute will very rarely be set. The default value will be used in most cases.

Procedure ShowPotentialProblemTables
    Handle hTable
    Integer iLockType
    String sTable
    Integer iDangerous

    Move 0 To hTable
    Move 0 To iDangerous

    Repeat
        Get_Attribute DF_FILE_NEXT_USED of hTable To hTable
        If (hTable > 0) Begin
            Open hTable
            Get_Attribute DF_FILE_LOCK_TYPE Of hTable To iLockType
            Get_Attribute DF_FILE_LOGICAL_NAME of hTable To sTable
            If (iLockType = DF_LOCK_TYPE_NONE) Begin
                Showln "DANGER! Table " sTable " will not be locked!"
                Increment iDangerous
            End
            Close hTable
        End
    Until (hTable = 0)

    If (iDangerous = 0) ;
        Showln "All tables in the filelist will be properly locked."
End_Procedure // ShowPotentialProblemTables

The sample procedure above will check every table in the file list for its lock type setting. When tables exist that have their lock type set to DF_LOCK_TYPE_NONE, these will be reported as potential problem tables.