enterprisephp / doctrine-lock-bundle
防止对象在删除、更新事件中被锁定
v1.0
2016-01-10 16:48 UTC
Requires
- php: ^5.5.9|~7.0
- psr/log: ^1.0
- symfony/framework-bundle: ^2.7|^3.0
Requires (Dev)
- jms/serializer-bundle: ^1.0
- sensio/framework-extra-bundle: ^3.0
- symfony/browser-kit: ^2.7|^3.0
- symfony/dependency-injection: ^2.7|^3.0
- symfony/form: ^2.7|^3.0
- symfony/phpunit-bridge: ~2.7|^3.0
- symfony/security-bundle: ^2.7|^3.0
- symfony/serializer: ^2.7|^3.0
- symfony/twig-bundle: ^2.7|^3.0
- symfony/validator: ^2.7|^3.0
- symfony/web-profiler-bundle: ^2.7|^3.0
- symfony/yaml: ^2.7|^3.0
Suggests
- jms/serializer-bundle: Add support for advanced serialization capabilities, recommended, requires ^1.0
- sensio/framework-extra-bundle: Add support for route annotations and the view response listener, requires ^3.0
- symfony/expression-language: Add support for using the expression language in the routing, requires ^2.7|^3.0
- symfony/serializer: Add support for basic serialization capabilities and xml decoding, requires ^2.7|^3.0
- symfony/validator: Add support for validation capabilities in the ParamFetcher, requires ^2.7|^3.0
This package is not auto-updated.
Last update: 2024-09-14 18:52:55 UTC
README
- 防止对象在插入、删除、更新事件中被锁定
- 防止实体在删除、更新事件中被锁定
相关链接;###
- https://github.com/doctrine/doctrine2/blob/master/docs/en/reference/transactions-and-concurrency.rst#locking-support
- https://dev.mysqlserver.cn/doc/refman/5.7/en/lock-tables.html
- https://www.wikiwand.com/en/Lock_(database)
- http://stackoverflow.com/questions/129329/optimistic-vs-pessimistic-locking
- 开发步骤可以参考https://github.com/behramcelen/symfony-bundle-develop
- 基本测试和逻辑命令可以在https://github.com/behramcelen/symfony-bundle-develop/blob/master/src/AppBundle/Command/LockBundleTestCommand.php#L41找到
安装
步骤 1: 下载 Bundle
打开命令行控制台,进入你的项目目录,并执行以下命令以下载此 Bundle 的最新版本
$ composer require enterprisephp/doctrine-lock-bundle "dev-master"
此命令需要你全局安装了 Composer,具体请参阅 Composer 文档的安装章节。
步骤 2: 启用 Bundle
然后,将 Bundle 添加到项目 app/AppKernel.php
文件中注册的 Bundle 列表
<?php // app/AppKernel.php // ... class AppKernel extends Kernel { public function registerBundles() { $bundles = array( // ... new EP\DoctrineLockBundle\EPDoctrineLockBundle(), ); // ... } // ... }
用法
Doctrine 对象锁定
use EP\DoctrineLockBundle\Params\ObjectLockParams; // ... $objectLocker = $container->get('ep.doctrine.object.locker'); //lock fully $objectLocker->lock(new DummyEntity()); //lock delete process $objectLocker->lock(new DummyEntity(), ObjectLockParams::DELETE_LOCK); //lock insert process $objectLocker->lock(new DummyEntity(), ObjectLockParams::INSERT_LOCK); //lock update process $objectLocker->lock(new DummyEntity(), ObjectLockParams::UPDATE_LOCK);
Doctrine 对象解锁
use EP\DoctrineLockBundle\Params\ObjectLockParams; // ... $objectLocker = $container->get('ep.doctrine.object.locker'); //unlock full lock $objectLocker->unlock(new DummyEntity()); //unlock delete process $objectLocker->unlock(new DummyEntity(), ObjectLockParams::DELETE_LOCK); //unlock insert process $objectLocker->unlock(new DummyEntity(), ObjectLockParams::INSERT_LOCK); //unlock update process $objectLocker->unlock(new DummyEntity(), ObjectLockParams::UPDATE_LOCK);
Doctrine 对象切换锁定
use EP\DoctrineLockBundle\Params\ObjectLockParams; // ... $objectLocker = $container->get('ep.doctrine.object.locker'); //switch full lock $objectLocker->switchLock(new DummyEntity()); //switch delete process $objectLocker->switchLock(new DummyEntity(), ObjectLockParams::DELETE_LOCK); //switch insert process $objectLocker->switchLock(new DummyEntity(), ObjectLockParams::INSERT_LOCK); //unswitchlock update process $objectLocker->switchLock(new DummyEntity(), ObjectLockParams::UPDATE_LOCK);
Doctrine 对象是否被锁定
use EP\DoctrineLockBundle\Params\ObjectLockParams; // ... $objectLocker = $container->get('ep.doctrine.object.locker'); //is full locked $objectLocker->isLocked(new DummyEntity()); //is delete locked $objectLocker->isLocked(new DummyEntity(), ObjectLockParams::DELETE_LOCK); //is insert locked $objectLocker->isLocked(new DummyEntity(), ObjectLockParams::INSERT_LOCK); //is update locked $objectLocker->isLocked(new DummyEntity(), ObjectLockParams::UPDATE_LOCK);
示例使用
$objectLocker = $container->get('ep.doctrine.object.locker'); //lock object $objectLocker->lock(new DummyEntity()); $em->persist(new DummyEntity()); // this will throw LockedObjectException
Doctrine 实体锁定
添加 Lockable 注解和 lockable 特性
namespace AppBundle\Entity; use EP\DoctrineLockBundle\Traits\LockableTrait; use EP\DoctrineLockBundle\Annotations\Lockable; /** * @Lockable */ class DummyEntity { use LockableTrait; // ...
示例使用
//create new dummy entity $dummyEntity = new DummyEntity(); $dummyEntity ->setTitle('Dummy Entity Title') ->setDescription('Dummy Entity Description') ->setUpdateLocked(true) //lock entity for update process ->setDeleteLocked(true) //lock entity for delete process ; $em->persist($dummyEntity); $em->flush(); $dummyEntity->setTitle('Update Dummy Entity Title'); $em->persist($dummyEntity); $em->flush(); // this will throw LockedEntityException because entity have update lock $em->remove($dummyEntity); // this will throw LockedEntityException because entity have delete lock
解锁实体锁定
//unlock update lock $dummyEntity->setUpdateLocked(false); //unlock delete lock $dummyEntity->setDeleteLocked(false);