Pergunta

Aqui está a minha encomenda transação desejada:

  1. User1 campo seleccionar, executar a operação, atualização com o novo valor.
  2. User2 campo seleccionar, executar a operação, atualização com o novo valor.
  3. User3 campo seleccionar, executar a operação, atualização com o novo valor.

Pelo que eu entender o primeiro selecionar apenas realizar um write-bloqueio, enquanto o segundo executar leitura e bloqueio de gravação.

Ambos parece utilizável, mas no primeiro caso, o valor será User2 ler? O valor inicial antes de atualizações Usuário1, ou o valor após atualizações Usuário1 (que é o que eu quero)?

Então, eu estou confuso, eu deveria usar SELECT ... FOR UPDATE ou instrução SELECT ... LOCK IN SHARE MODE?

Foi útil?

Solução

Você provavelmente vai querer usar FOR UPDATE.

Com "LOCK IN SHARE MODE" o segundo usuário ainda será capaz de ler o valor antes que ele foi atualizado.

De docs MySQL:

Se você utilizar FOR UPDATE com um armazenamento motor que página usa ou linha fechaduras, linhas examinados pela consulta são escreva-bloqueado até que o fim do transação atual. Usando LOCK IN SHARE MODE define um bloqueio compartilhado que permite que outras transações para ler a linhas examinadas, mas não para atualizar ou excluí-los.

Assim, mesmo que LOCK IN SHARE MODE impede uma atualização, se você operação depende do valor de leitura, você pode acabar em um estado inconsistente.

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top