Solucionado (ver solução)
Solucionado
(ver solução)
3
respostas

Isolamento de Transações com PDO

<?php
  try 
  {
    $pdo = Conexao::pegarConexao();

    $pdo->beginTransaction();

    $query = "insert into produtos (nome, preco) values (:nome, :preco);

    $smt = $pdo->prepare($query);
    $smt->bindValue(":nome","caneta");
    $smt->bindValue(":preco",10);
    $smt->execute();

    $pdo->commit();

    print $pdo->lastInsertId(); 

  } catch (Exception $e) 
  {
    $pdo->rollBack();
    echo "Erro: " . $e->getMessage();
  }

Estou com uma duvida, se houvesse a necessidade de trabalhar num contexto transacional utilizando $pdo (singleton) servindo acesso a banco de dados para todas as transações em execução. Teriamos o problema de uma transação interferir na outra considerando uma unica instância do pdo ? Ou os metodos $pdo->beginTransaction() e $pdo->commit() garantem esse isolamento ? Num contexto concorrente onde varias transações (insert produtos) ocorressem ao mesmo tempo o $pdo->lastInsertId() poderia ser afetado retornando o ultimo id inserido ao invés do id gerado na transação corrente ?

3 respostas
solução!

Oi Samuel, tudo bom?

Legal sua preocupação em paralelismo. Entretanto, no php, todo script é carregado em uma thread. Ou seja, se dois requests rolarem ao mesmo tempo, cada um estaria com sua instância do PDO (mesmo trabalhando com singleton). Então, seriam duas conexões no pool da base, e isso ficaria gerênciado pelo mysql.

Abraço

Obrigado André. A duvida surgiu pq estou iniciando o desenvolvimento de uma API com php + slimframework + pdo na camada de dados.Terei vários cenários de concorencia, e ainda não comecei a fazer testes.

Você me indica alguma literatura avançada que trata dessas questões mais complexas do fluxo de vida de um processo php ?

Um livro bem legal (porém disponivel só em inglês) é esse aqui:

https://github.com/phpinternalsbook/PHP-Internals-Book

eles explicam bastante coisa sobre o core da linguagem =)

mais especificamente aqui é comentado a parte de ciclo de vida.