/**
	 * release all lock acquired by this instance which were marked using the mark* methods
	 */
	public function releaseAll() {
		parent::releaseAll();

		// since we keep shared locks we need to manually clean those
		foreach ($this->sharedLocks as $path => $lock) {
			if ($lock) {
				$this->connection->executeUpdate(
					'UPDATE `*PREFIX*file_locks` SET `lock` = `lock` - 1 WHERE `key` = ? AND `lock` > 0',
					[$path]
				);
			}
		}
	}
 /**
  * release all lock acquired by this instance which were marked using the mark* methods
  */
 public function releaseAll()
 {
     parent::releaseAll();
     // since we keep shared locks we need to manually clean those
     $lockedPaths = array_keys($this->sharedLocks);
     $lockedPaths = array_filter($lockedPaths, function ($path) {
         return $this->sharedLocks[$path];
     });
     $chunkedPaths = array_chunk($lockedPaths, 100);
     foreach ($chunkedPaths as $chunk) {
         $builder = $this->connection->getQueryBuilder();
         $query = $builder->update('file_locks')->set('lock', $builder->createFunction('`lock` -1'))->where($builder->expr()->in('key', $builder->createNamedParameter($chunk, IQueryBuilder::PARAM_STR_ARRAY)))->andWhere($builder->expr()->gt('lock', new Literal(0)));
         $query->execute();
     }
 }