tourze / doctrine-entity-lock-bundle
实体加锁
0.0.1
2025-04-15 15:15 UTC
Requires
- php: ^8.1
- doctrine/orm: ^2.20 || ^3.0
- psr/log: ^3|^2|^1
- symfony/config: ^6.4
- symfony/dependency-injection: ^6.4
- symfony/framework-bundle: ^6.4
- symfony/http-kernel: ^6.4
- symfony/lock: ^6.4
- symfony/yaml: ^6.4 || ^7.1
- tourze/lock-service-bundle: 0.0.*
Requires (Dev)
- phpstan/phpstan: ^2.1
This package is auto-updated.
Last update: 2025-04-26 16:34:55 UTC
README
这个 Symfony Bundle 提供了一种简单的方式来为 Doctrine 实体应用分布式锁机制,可以用于处理并发操作。
功能
- 为单个实体应用分布式锁
- 为多个实体一次性应用分布式锁
- 在获取锁后自动从数据库刷新实体数据,确保数据的一致性
安装
composer require tourze/doctrine-entity-lock-bundle
在 Symfony 应用的 config/bundles.php
中添加:
Tourze\DoctrineEntityLockBundle\DoctrineEntityLockBundle::class => ['all' => true],
使用方法
前提条件
确保你的实体类实现了 Tourze\LockServiceBundle\Model\LockEntity
接口:
use Tourze\LockServiceBundle\Model\LockEntity; class User implements LockEntity { // ... public function retrieveLockResource(): string { return 'user:' . $this->id; } }
锁定单个实体
use Tourze\DoctrineEntityLockBundle\Service\EntityLockService; class UserService { public function __construct(private readonly EntityLockService $entityLockService) { } public function updateUser(User $user, array $data): void { $this->entityLockService->lockEntity($user, function () use ($user, $data) { // 这里的代码在获取锁后执行 // 实体已经被自动刷新,确保数据的一致性 $user->setName($data['name']); // ... return $result; }); } }
锁定多个实体
use Tourze\DoctrineEntityLockBundle\Service\EntityLockService; class TransferService { public function __construct(private readonly EntityLockService $entityLockService) { } public function transfer(Account $from, Account $to, float $amount): void { $this->entityLockService->lockEntities([$from, $to], function () use ($from, $to, $amount) { // 这里的代码在获取全部锁后执行 // 所有实体都已经被自动刷新,确保数据的一致性 $from->debit($amount); $to->credit($amount); // ... return $result; }); } }
测试
运行测试:
./vendor/bin/phpunit packages/doctrine-entity-lock-bundle/tests