What are the techniques for Concurrency Control?
1.Locking: Locking mechanisms include shared locks (read locks) and exclusive locks (write locks). Shared locks allow multiple users to read data concurrently, while exclusive locks grant write access to only one user at a time. Locks prevent conflicts by enforcing a "wait your turn" approach.
2.Timestamping: Timestamps are assigned to data transactions, allowing the system to track when each change occurred. Conflicts are resolved based on these timestamps, with the most recent update typically taking precedence.
3. Versioning: Versioning assigns a unique version number to each data record. Users can modify records independently, and conflicts are resolved by comparing version numbers. This method provides a clear history of changes.
Generating Unique Auto Numbers in CRM with Concurrency Control: A Plugin Example
Method 1 -
Requirement: A plugin that
- Can be applied to any numbering series.
- Generates a unique number for each individual record.
Create custom auto number table where each row will represent a specific numbering series (Account, Policy, claims, etc.)
Need an action that can be called on the creation of a new record that will,
A.Look into the table to choose the numbering series to use.
B. Place a write lock on the number series.
C. Queue up any subsequent request for that number series.
D. Hand off the numbering to the requesting record.
E. Once transaction is committed update the number to the next.
F. Release Write lock for next request in the queue.
Precondition: I have created a table called "new_numberseries" as the numbering table and added the required fields to the number series table. Additionally, I have set up an auto-number field on the account entity.
Step 1: Setting up the Development Environment
1. Open Visual Studio (e.g., Visual Studio 2017 or any other version).
2. Create a new Class Library (.NET Framework) project using .NET Framework 4.6.2. The name used for the project will be the same as the name of the assembly.
3. Install the SDK CoreAssembly from NuGet Package Manager to access CRM functionality. In Solution Explorer, right-click the project, and then select 'Manage NuGet Packages' from the context menu.
4. thrSelect Browse and search for Microsoft.CrmSdk.CoreAssemblies and install the latest version. You must choose 'I Accept' in the License Acceptance dialog.
Step 2: Writing the Plugin Code
1. Add the following using statements to the top of the Autonumber.cs file:
2. Implement the IPlugin interface by editing the class.
3. Replace the contents of the Execute method with the following code (the necessary code to implement concurrency control for generating unique auto numbers on CRM entities). Here's an example of the code:
4. Now, add the following code after the execute method. The below code includes two methods one for acquiring a lock and another for releasing the lock.
Step 3: Registering the Plugin
1. Build the project, navigate to the "Build" tab (or "Rebuild" if necessary) and then copy the path. Then, use the Plugin Registration Tool to register your plugin in a CRM environment of your choice.
2. After registering your plugin, add the plugin step. In my case, I added the plugin step of the "create" event on the "account" entity.
Method 2 -
Instead of creating additional fields for tracking locks or clearing them afterward, this approach also utilizes a custom table for Auto Number generation. Here's a step-by-step guide:
1. Create a "Lock" Field:
In the custom table designed for Auto Number generation, create a new text field named "Locked" (you can choose any appropriate name).
2. Retrieve the Record:
When you need to retrieve a record from this custom table, which stores a sequence or series, initiate the retrieval process.
3. Update the "Lock" Field:
Immediately upon retrieving the record, update the "Locked" field with a value. A commonly used value can be the current date and time, obtained using DateTime.Now.ToString().
4. Proceed with Logic:
Now, you can proceed with the rest of your logic, confident that the record is locked for your exclusive use.
5. Unlock Mechanism:
After you've completed your plugin or process, there's no need to explicitly clear the "Locked" field. The concept is to modify a non-essential field in the series/sequence record immediately upon retrieval. When you update the field, it locks the record, preventing other threads from reading it until your plugin has finished its task.
Implementing a locking mechanism with a "Locked" field in a custom table is a practical and effective approach for generating unique auto numbers in a CRM entity. By following this method, you can ensure data consistency, prevent conflicts, and streamline your auto-number generation process.