team-a / lock
基于 MySQL 锁定服务的独占和读写锁定。
1.2.1
2020-12-19 18:49 UTC
Requires
- php: ^7.1
- ext-pdo: *
This package is auto-updated.
Last update: 2024-09-20 02:52:44 UTC
README
基于 MySQL 锁定服务的独占和读写锁定
要求
- php >= 7.1
- PDO 扩展
需要安装 MySQL 文档中描述的锁定服务 UDFs
https://dev.mysqlserver.cn/doc/refman/8.0/en/locking-service-udf-interface.html
通过 Composer 安装
composer require team-a/lock:^1.2.0
示例
- 注入 PDO 实例承诺。您可以为 PDO 创建懒加载实例。
$serviceManager = $this->getServiceManager(); AbstractDb::setPdoPromise( function() use ($serviceManager) : \PDO { return $serviceManager->getPDO(); } );
-
定义并使用基于 TeamA\Lock\AbstractDBExclusive 或 TeamA\Lock\AbstractDBExtended 的自定义锁类。
-
独占锁示例
class Point extends AbstractDbExclusive { protected function __construct( int $providerId, ? string $providerPointId, ? string $providerPointEssentialId ) { parent::__construct([ $providerId, $providerPointId, $providerPointEssentialId ]); } } /* ... */ $pointLock = new Point($pId, $pPointId, null); try { $pointLock->lock(); $this->_db->beginTransaction(); // do smth. $this->_db->commit(); return true; } catch (TeamA\Lock\TimeoutException $e) { return false; } catch (\Exception $e) { $this->_db->rollback(); throw $e; } finally { $pointLock->releaseIfLocked(); }
- 读写锁定示例
class GeoBinding extends AbstractDbExtended { public function __construct(int $departureProviderId) { parent::__construct(func_get_args()); } } /* ... */ $lock = new GeoBinding(static::_getProviderId()); try { $lock->lockWrite(); $this->_db->beginTransaction(); // do smth. $this->_db->commit(); return true; } catch (TeamA\Lock\TimeoutException $e) { return false; } catch (\Exception $e) { $this->_db->rollback(); throw $e; } finally { $lock->release(); } /* ... */ $lock = new GeoBinding(static::_getProviderId()); try { $lock->lockRead(); $this->_db->beginTransaction(); // do smth. else...