RecordLockingConflict class: Difference between revisions
m (→Usage notes) |
|||
Line 135: | Line 135: | ||
====Usage notes==== | ====Usage notes==== | ||
<ul> | <ul> | ||
<li>If the [[RECLOCKO_parameter|RECLOCKO parameter]] X'04' bit isn't set, this property will return a <var>Null</var>value. | <li>If the [[RECLOCKO_parameter|RECLOCKO parameter]] X'04' bit isn't set, this property will return a <var>Null</var> value. | ||
</ul> | </ul> | ||
<br/><br/> | <br/><br/> |
Revision as of 14:54, 30 August 2012
The RecordLockingConflict exception class catches record locking conflict errors thrown by file object operations; that is from methods in the file (that is: Record, Recordset, SortedRecordset, and RecordsetCursor) classes.
Summary
A RecordLockingConflict exception is thrown only if there is a Catcher for the exception. This allows On record Locking Conflict
and On Find Conflict
units to trap record locking conflicts if there is no Catch block for the exception.
There is no distinction between a Find conflict and a record locking conflict. For example, you can use the following:
try fd to %foo ... end find catch recordLockingConflict ... end try
And you can also use:
try %rec = new(%recnum, exclusive) for record %rec ... end for catch recordLockingConflict ... end try
You can even catch record locking conflicts caused by LoopLockStrength promotions during a loop:
%rec = new(%recnum, none, loopLockStrength=share) ... try for record %rec ... end for catch recordLockingConflict ... end try
Or as in the following:
%curser = new(%recset, loopLockStrength=none) ... try for record at cursor %curser ... end for catch recordLockingConflict .. end try
Or as in this example:
fdwol to %recset = new(loopLockStrength=exclusive) ... end find ... try for each record in %recset ... end for catch recordLockingConflict ... end try
In the latter example, note that any iteration of the For loop can throw an exception, and there is no way of picking up where you left off (at the next record, say) if you get a RecordLockingConflict exception in such a case. So, unless you always want to lose the whole loop on a record locking conflict, such a case is almost always better structured with a cursor on the recordset and with Try around the For Record At Cursor loop:
fdwol to %recset = new(loopLockStrength=exclusive) ... end find ... %curser = new(%recset, loopLockStrength=exclusive) repeat while %curser:state eq hasRecord try for record at cursor %curser ... end for catch recordLockingConflict ... end try %curser:next end repeat
Note: The For statement can be on the same line as the Try, or it can be inside the Try block.
The RecordLockingConflict methods
The following are the available RecordLockingConflict class methods.
Method | Description |
---|---|
ConflictTimeMilliseconds | Time that the conflict occurred |
ConflictingLockStrength | Lock strength of conflicting lock |
ConflictingRecordLockType | Lock type of conflicting lock |
Copy | Copy the RecordLockingConflict object |
DeepCopy | Deep copy the RecordLockingConflict object |
Filename | Name of the file in which last record locking conflict occurred |
LockTimeMilliseconds | Time that the conflicting record was locked |
LockingUserNumber | User number of the user that locked the conflicting record |
New | Create a new RecordLockingConflict object |
NewFromLastConflict | Create object from current conflict information |
RecordNumber | Record number of the record that has the conflict |
UserID | User ID (login name) of the user that has the conflict |
UserNumber | User number of the user that has the conflict |
The methods in the class are described in the subsections that follow. In addition:
- "Notation conventions for methods" has information about the conventions followed.
- "RecordLockingConflict methods syntax" is a single page that contains the syntax diagrams of all the methods in the class.
ConflictingLockStrength property
Lock strength of conflicting lock (RecordLockingConflict class)
This ReadOnly returns a LockStrength enumeration value indicating the strength of the lock held by another user that caused the conflict.
Syntax
%lockStrength = recordLockingConflict:ConflictingLockStrength
Syntax terms
%lockStrength | A variable to receive the output value, a LockStrength enumeration value. |
---|---|
recordLockingConflict | A reference to an instance of a RecordLockingConflict object. |
Usage notes
- If the RECLOCKO parameter X'04' bit isn't set, this property will return a Null value.
- Since an unlocked record (LockStrength None) cannot cause an record locking conflict, a non-Null return value should always be either Share or Exclusive.
ConflictingRecordLockType property
Lock type of conflicting lock (RecordLockingConflict class)
This ReadOnly returns a RecordLockType enumeration value indicating the type of the lock held by another user that caused the conflict.
Syntax
%recordLockType = recordLockingConflict:ConflictingRecordLockType
Syntax terms
%recordLockType | A variable to receive the output value, a RecordLockType enumeration value. |
---|---|
recordLockingConflict | A reference to an instance of a RecordLockingConflict object. |
Usage notes
- If the RECLOCKO parameter X'04' bit isn't set, this property will return a Null value.
ConflictTimeMilliseconds property
Time that the conflict occurred (RecordLockingConflict class)
This ReadOnly property returns a number that is the number of milliseconds since 1900 that the record locking conflict occurred.
Syntax
%number = recordLockingConflict:ConflictTimeMilliseconds
Syntax terms
%number | A variable to receive the output value. |
---|---|
recordLockingConflict | A reference to an instance of a RecordLockingConflict object. |
Usage notes
- The MillisecondsToString method can be used to convert this value to a more human-friendly format.
Filename property
Name of the file in which last record locking conflict occurred (RecordLockingConflict class)
This ReadOnly property returns a Longstring that contains the name of the file in which the last record locking conflict occurred.
Syntax
%string = recordLockingConflict:Filename
Syntax terms
%string | A longstring to receive the file name. |
---|---|
recordLockingConflict | A reference to an instance of a RecordLockingConflict object. |
New constructor
Create a new RecordLockingConflict object (RecordLockingConflict class)
This Constructor generates an instance of an RecordLockingConflict exception. As shown in the syntax that follows, the New method arguments set the values of the class properties having the corresponding names. Each argument to New sets the value of the corresponding property of the newly constructed RecordLockingConflict object.
Syntax
%recordLockingConflict = [%(RecordLockingConflict):]New( Filename= string, - RecordNumber= number, - UserNumber= number, - UserID= string, - [LockingUserNumber= number], - [LockTimeMilliseconds= number], - [ConflictTimeMilliseconds= number], - [ConflictingLockStrength= lockStrength], - [ConflictingRecordLockType= recordLockType])
Syntax terms
%recordLockingConflict | A reference to an instance of a RecordLockingConflict object. |
---|---|
[%(RecordLockingConflict):] | The class name in parentheses denotes a Constructor. |
Filename | This name required parameter specifies the Longstring value (string) to be assigned to the object's Filename property. Its default value is a null string. |
RecordNumber | This name required parameter specifies the numeric value (number) to be assigned to the object's RecordNumber property. Its default value is 0. |
UserNumber | This name required parameter specifies the numeric value (number) to be assigned to the exception object's UserNumber property. Its default value is 0. |
UserID | This name required parameter specifies the longstring value (string) to be assigned to the object's UserID property. Its default value is a null string. |
RecordNumber property
Record number of the record that has the conflict (RecordLockingConflict class)
This ReadOnly property returns the numeric value of the Model 204 internal record number of the record that has the conflict.
Syntax
%number = recordLockingConflict:RecordNumber
Syntax terms
%number | A numeric variable to receive the record number. |
---|---|
recordLockingConflict | A reference to an instance of a RecordLockingConflict object. |
Example
The following example shows all the properties of the RecordLockingConflict class. While the standard record locking conflict information is available for retrieval via the User Language functions $rlcfile, $rlcrec, $rlcuid, and $rlcusr, that information is also set in the exception object and retrievable via that object:
%rlc is object RecordLockingConflict ... %rec = new(%recnum, none, loopLockStrength=share) ... try for record %rec ... end for catch recordLockingConflict to %rlc auditText Conflict on record {%rlc:recordNumber} - in file {%rlc:filename} auditText Conflicting user was userid {%rlc:userid}, - with user number:{%rlc:userNumber} end try
UserID property
User ID (login name) of the user that has the conflict (RecordLockingConflict class)
This ReadOnly property returns the Model 204 userid (login name) of the user that has the conflict.
Syntax
%string = recordLockingConflict:UserID
Syntax terms
%string | A longstring to receive the userid value. |
---|---|
recordLockingConflict | A reference to an instance of a RecordLockingConflict object. |
UserNumber property
User number of the user that has the conflict (RecordLockingConflict class)
This ReadOnly property returns the user number (unique per session) of the user that has the conflict.
Syntax
%number = recordLockingConflict:UserNumber
Syntax terms
%number | A numeric variable to receive the user number. |
---|---|
recordLockingConflict | A reference to an instance of a RecordLockingConflict object. |