使用锁处理并发性

编辑本页

警告:您正在浏览的文档欧宝官网下载appob娱乐下载Symfony 5.1,现已不再维护。

本页的更新版本用于Syob娱乐下载mfony 6.2(当前稳定版本)。

使用锁处理并发性

当一个程序并发运行时,修改共享资源的部分代码不应该被多个进程同时访问。ob娱乐下载Symfony的锁组件提供一种锁定机制,以确保在任何时间点只有一个进程在运行临界代码段,以防止发生竞态条件。

下面的例子展示了锁的典型用法:

1 2 3 4 5 6 7 8 9
lockFactory->createLock (“pdf-invoice-generation”);如果(!->获得()){返回;}//代码的关键部分服务->方法();->release ();

安装

在使用ob娱乐下载Symfony Flex,执行此命令安装Lock组件:

1
作曲家需要symfony/lockob娱乐下载

使用FrameworkBundle配置锁

默认情况下,Symfonob娱乐下载y提供了一个信号量有空时,还是一个否则。属性配置此行为关键:

  • YAML
  • XML
  • PHP
12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
#配置/包/ lock.yaml框架:锁:锁:“群”锁:“群:/ / /道路/ /文件的锁:“信号”锁:“memcached: / / m1.docker”锁:[' memcached: / / m1.docker ',“memcached: / / m2.docker”锁:“复述:/ / r1.docker”锁:['复述:/ / r1.docker ',“复述:/ / r2.docker”锁:动物园管理员:/ / z1.docker”锁:动物园管理员:/ / z1.docker, z2.docker锁:sqlite: / / / % kernel.project_dir % / var / lock.db '锁:“mysql:主机= 127.0.0.1;dbname =应用'锁:“pgsql:主机= 127.0.0.1;dbname =应用'锁:“sqlsrv:服务器= 127.0.0.1;数据库=应用'锁:oci:主机= 127.0.0.1;dbname =应用'锁:mongodb: / / 127.0.0.1 /应用程序吗?收集=锁'锁:' % env (LOCK_DSN) %#命名锁锁:发票:(“信号”,“复述:/ / r2.docker”报告:“信号”

锁定资源

若要锁定默认资源,请使用LockInterface(服务标识):

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23
/ / src /控制器/ PdfController.php名称空间应用程序控制器使用ob娱乐下载FrameworkBundle控制器AbstractController使用ob娱乐下载组件LockInterfacePdfController扩展AbstractController/ * * *@Route(“/下载/ terms-of-use.pdf”)* /公共函数downloadPdf(LockInterface, MyPdfGeneratorServicepdf->获得(真正的);//繁重的计算myPdfpdf->getOrCreatePdf ();->release ();/ /……}}

谨慎

的相同实例LockInterface调用时不会阻塞收购在同一进程内多次。当多个服务使用相同的锁时,注入LockFactory而是为每个服务创建单独的锁实例。

锁定动态资源

有时应用程序能够将资源切割成小块,以便锁定一小部分进程,并让其他进程通过。在我们前面的例子中,看看如何锁定pdf - > getOrCreatePdf(“使用条款”)对于每个人,现在让我们看看如何锁定pdf - > getOrCreatePdf(版本)仅适用于请求相同的进程美元的版本

12 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24
/ / src /控制器/ PdfController.php名称空间应用程序控制器使用ob娱乐下载FrameworkBundle控制器AbstractController使用ob娱乐下载组件LockFactoryPdfController扩展AbstractController/ * * *@Route(“/下载/ {version} / terms-of-use.pdf”)* /公共函数downloadPdf版本, LockFactorylockFactory, MyPdfGeneratorServicepdflockFactory->createLock (版本);->获得(真正的);//繁重的计算myPdfpdf->getOrCreatePdf (版本);->release ();/ /……}}

叫锁

如果应用程序需要不同种类的store, Symfony可以提供ob娱乐下载叫锁

  • YAML
  • XML
  • PHP
1 2 3 4 5
#配置/包/ lock.yaml框架:锁:发票:(“信号”,“复述:/ / r2.docker”报告:“信号”

每个名称都成为一个服务,其中服务id以锁的名称作为后缀(例如。lock.invoice).还为每个锁创建一个自动装配别名,使用其名称的驼峰大小写版本——如。发票可以通过命名参数自动注入吗invoiceLock美元然后打字提示LockInterface

ob娱乐下载Symfony还提供了遵循相同规则的相应工厂和存储。发票生成一个lock.invoice.factory而且lock.invoice.store,两者都可以通过分别命名自动注入invoiceLockFactory美元而且invoiceLockStore美元还有打字提示LockFactory而且PersistingStoreInterface

阻止商店

如果你想用RetryTillSaveStore非阻塞锁,你可以做这件事装饰商店服务:

1 2 3 4
lock.default.retry_till_save.store:类:ob娱乐下载Symfony \ \锁\ \ RetryTillSaveStore存储组件装饰:lock.default.store参数:[' @.inner ',One hundred.50
此工作,包括代码示例,是根据创作共用BY-SA 3.0许可证。