SQL atomique d'incrémentation et de verrouillage des stratégies - est-ce sûr?

J'ai une question à propos de SQL et de verrouillage des stratégies. Comme exemple, supposons que j'ai un compteur de vue pour les images sur mon site. Si j'ai une procédure stockée ou similaire à effectuer les déclarations suivantes:

START TRANSACTION;
UPDATE images SET counter=counter+1 WHERE image_id=some_parameter;
COMMIT;

Supposer que le compteur pour un image_id a une valeur de " 0 " à l'instant t0. Si deux sessions de mise à jour de la même image, compteur, s1 et s2, de démarrer simultanément à t0, est-il possible que ces deux sessions à la fois de lire la valeur "0", l'augmenter à '1' et les deux essayer de mettre à jour le compteur à '1', de sorte que le compteur d'obtenir la valeur '1' au lieu de '2'?

s1: begin
s1: begin
s1: read counter for image_id=15, get 0, store in temp1
s2: read counter for image_id=15, get 0, store in temp2
s1: write counter for image_id=15 to (temp1+1), which is 1 
s2: write counter for image_id=15 to (temp2+1), which is also 1
s1: commit, ok
s2: commit, ok

Résultat final: pas la valeur " 1 " pour image_id=15, doit avoir été 2.

Mes questions sont:

  1. Ce scénario est-il possible?
  2. Si oui, le niveau d'isolation de transaction question?
  3. Est-il un outil de résolution de conflits qui permettrait de détecter un tel conflit comme une erreur?
  4. Peut-on utiliser n'importe syntaxe particulière afin d'éviter un problème (quelque chose comme Comparer Et Swap (CAS) ou explicite verrouillage des techniques)?

Je suis intéressé par une réponse générale, mais si on n'y fait, je suis intéressé par MySql et InnoDB-des réponses précises, car je suis en train d'utiliser cette technique pour mettre en œuvre des séquences sur InnoDB.

EDIT:
Le scénario suivant pourrait également être possible, le même comportement. Je suis en supposant que nous sommes dans le niveau d'isolation READ_COMMITED ou plus, de sorte que le s2 obtient la valeur depuis le début de la transaction, même si s1 déjà écrit " 1 " pour le compteur.

s1: begin
s1: begin
s1: read counter for image_id=15, get 0, store in temp1
s1: write counter for image_id=15 to (temp1+1), which is 1 
s2: read counter for image_id=15, get 0 (since another tx), store in temp2
s2: write counter for image_id=15 to (temp2+1), which is also 1
s1: commit, ok
s2: commit, ok