mirror of https://github.com/abpframework/abp
parent
34c89d2900
commit
6bd0c4bc0c
@ -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