mirror of https://github.com/abpframework/abp.git
2 changed files with 76 additions and 0 deletions
@ -0,0 +1,72 @@ |
|||
# Distributed Lock |
|||
Distributed locks are very useful to manage many processes that request the same object. |
|||
They are used to handle conflict between these requests. Once obtaining anyone it, the others need to wait till give up free. |
|||
|
|||
# Providers |
|||
`MedallionAbpDistributedLock` |
|||
Distributed locks system provides an abstraction that can be implemented by any vendor/provider. |
|||
ABP depends on [DistributedLock.Core](https://www.nuget.org/packages/DistributedLock.Core) library which provides a distributed locking system for concurrency control in a distributed environment. There are [many distributed lock providers](https://github.com/madelson/DistributedLock#implementations) including Redis, SqlServer and ZooKeeper. You may use the one you want. Here, I will show the Redis provider. |
|||
|
|||
This provider contains a method named TryAcquireAsync and this method returns null if the lock could not be handled. |
|||
> Name is a mandatory field. It keeps the locked provider name. |
|||
> Timeout is set as default. If it fells deadlock and doesn't work properly you can use define the time to kill it. |
|||
>CancellationToken is set as default. It enables cooperative cancellation between threads, thread pool work items, or Task objects |
|||
|
|||
|
|||
Also, you should add [DistributedLock.Redis](https://www.nuget.org/packages/DistributedLock.Redis) NuGet package to your project, then add the following code into the ConfigureService method of your ABP module class. |
|||
|
|||
````csharp |
|||
using Medallion.Threading; |
|||
using Medallion.Threading.Redis; |
|||
namespace AbpDemo |
|||
{ |
|||
public class MyModule : AbpModule |
|||
{ |
|||
public override void ConfigureServices(ServiceConfigurationContext context) |
|||
{ |
|||
//the other configurations |
|||
var configuration = context.Services.GetConfiguration(); |
|||
|
|||
context.Services.AddSingleton<IDistributedLockProvider>(sp => |
|||
{ |
|||
var connection = ConnectionMultiplexer.Connect(configuration["Redis:Configuration"]); |
|||
return new RedisDistributedSynchronizationProvider(connection.GetDatabase()); |
|||
}); |
|||
} |
|||
} |
|||
} |
|||
```` |
|||
|
|||
Also, you should add your Redis configuration in appsetting.json |
|||
````json |
|||
"Redis": { |
|||
"Configuration": "127.0.0.1" |
|||
} |
|||
```` |
|||
|
|||
> To use in APB, you should download the below NuGet package. |
|||
It already contains DistributedLocking.Abstractions and no need to download as well. |
|||
````powershell |
|||
Install-Package Volo.Abp.DistributedLocking -Version 5.1.4 |
|||
```` |
|||
|
|||
````csharp |
|||
using Volo.Abp.DistributedLocking; |
|||
namespace AbpDemo |
|||
{ |
|||
public class MyService : ITransientDependency |
|||
{ |
|||
private readonly IAbpDistributedLock _distributedLock; |
|||
public MyService(IAbpDistributedLock distributedLock) |
|||
{ |
|||
_distributedLock = distributedLock; |
|||
} |
|||
|
|||
await using (var handle = await _distributedLock.TryAcquireAsync("NameOfLock")) |
|||
{ |
|||
if (handle != null) |
|||
{ |
|||
//your code |
|||
} |
|||
} |
|||
```` |
|||
Loading…
Reference in new issue