<?php
namespace nur\sery\db;

/**
 * Class ITransactor: un objet qui peut faire des opérations dans une
 * transaction
 */
interface ITransactor {
  /**
   * Indiquer qu'une transaction va être étendue à tous les objets mentionnés
   */
  function willUpdate(...$transactors): self;

  function inTransaction(): bool;

  /**
   * démarrer une transaction
   *
   * si $func!==null, l'apppeler. ensuite, si $commit===true, commiter la
   * transaction. si une erreur se produit lors de l'appel de la fonction,
   * annuler la transaction
   *
   * $func est appelée avec la signature ($this)
   */
  function beginTransaction(?callable $func=null, bool $commit=true): void;

  function commit(): void;

  function rollback(): void;
}
