处理并发锁

编辑该页面

警告:你浏览的文档欧宝体育电话欧宝娱乐app下载地址Symfony 5.3,不再维护。

这个页面的更新版本Symf欧宝娱乐app下载地址ony 6.2(当前的稳定版本)。

处理并发锁

当一个程序同时运行,部分代码修改共享资源不应该由多个进程同时访问。欧宝娱乐app下载地址Symfony的锁组件提供了一种锁定机制来确保只有一个进程运行代码的关键部分在任何的时间点以防止竞争条件发生。

下面的示例显示了一个典型的锁的用法:

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

安装

在应用程序中使用欧宝娱乐app下载地址Symfony Flex,运行这个命令安装锁组件:

1
美元作曲家需要symfony /锁欧宝娱乐app下载地址

配置与FrameworkBundle锁

默认情况下,Symfon欧宝娱乐app下载地址y提供了信号量当可用,或否则。您可以配置使用的这种行为关键:

  • YAML
  • XML
  • PHP
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21日22日23日24日25
#配置/包/ 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 =应用'锁:“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”]报告:“信号”

锁定一个资源

锁默认资源,自动装配锁厂使用LockFactory(服务标识lock.factory):

1 2 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名称空间应用程序\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\\LockFactory;PdfController扩展AbstractController{/ * * *@Route(“/下载/ terms-of-use.pdf”) * /公共函数downloadPdf(LockFactory美元工厂,MyPdfGeneratorService美元pdf){美元=美元工厂- >createLock (“pdf-creation”);美元- >获得(真正的);/ /重计算美元myPdf=美元pdf- >getOrCreatePdf ();美元- >release ();/ /……}}

谨慎

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

锁定一个动态的资源

有时应用程序能够资源切成小块,以锁定过程的一个小子集,让别人通过。前面的示例展示了如何锁定$ pdf - > getOrCreatePdf(“使用条款”)对于每个人,现在让我们看看如何锁(pdf - > getOrCreatePdf美元版本)只有流程要求相同美元的版本:

1 2 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名称空间应用程序\控制器;使用欧宝娱乐app下载地址\\FrameworkBundle\控制器\AbstractController;使用欧宝娱乐app下载地址\组件\\LockFactory;PdfController扩展AbstractController{/ * * *@Route(“/下载/ {version} / terms-of-use.pdf”) * /公共函数downloadPdf(美元版本,LockFactory美元lockFactory,MyPdfGeneratorService美元pdf){美元=美元lockFactory- >createLock (美元版本);美元- >获得(真正的);/ /重计算美元myPdf=美元pdf- >getOrCreatePdf (美元版本);美元- >release ();/ /……}}

叫锁

如果应用程序需要与对方不同的商店,Symfony提供了欧宝娱乐app下载地址叫锁:

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

每个名称成为服务的服务id是锁的名称(如的一部分。lock.invoice.factory)。一个自动装配别名也为每个锁使用驼峰式大小写版本创建的名称后缀LockFactory——如。发票可以自动注入命名的论点吗invoiceLockFactory美元并类型提示LockFactory

阻止商店

如果你想使用RetryTillSaveStore非阻塞锁,你可以做到装修商店服务:

1 2 3 4
lock.default.retry_till_save.store:类:欧宝娱乐app下载地址Symfony \ \锁\ \ RetryTillSaveStore存储组件装饰:lock.default.store参数:[' @.inner ',One hundred.,50]
这项工作,包括代码示例,许可下Creative Commons冲锋队3.0许可证。
欧宝娱乐app下载地址Symfony 5.3支持通过JoliCode