Actualmente estoy jugando con las transacciones y no puedo entender el siguiente escenario:¿Por qué esta transacción no funciona en ActiveRecord?
Dado que hay un usuario con nombre de usuario "johnny" y el nombre completo "John Smith".
empiezo dos consolas carriles y llevar a cabo los siguientes comandos en este orden:
consola A:
ActiveRecord::Base.transaction { user = User.find_by_username("foo"); sleep 10; user.update_attribute(:full_name, "#{user.full_name}-1"); }
consola B:
ActiveRecord::Base.transaction { user = User.find_by_username("foo"); sleep 10; user.update_attribute(:full_name, "#{user.full_name}-2"); }
Así que el momento es el siguiente:
A dice "John Smith"
B lee "John Smith"
A escribe "John Smith-1"
B escribe "John Smith-2"
De acuerdo con mi base de datos de transacciones de clase B debe dejar de escribir "John Smith-2 "porque los datos han cambiado desde que lo leyeron. Por lo tanto, la transacción debería revertirse y la transacción A debería ganar. Espero que el nombre de usuario sea "John Smith-1", pero el resultado es "John Smith-2".
¿Alguna idea de por qué sucede esto o cómo obtener el comportamiento esperado?
Saludos cordiales
Nils
Podría ser el nivel de aislamiento de la conexión. Asegúrese de que sea un bloqueo optimista y no una estabilidad del cursor. Además, podría ser, irónicamente, debido a la transacción. Si ambos bloques están en una transacción, técnicamente, el segundo debe * comenzar * hasta que el primero finalice, o debe seguir las reglas definidas en ACID que la segunda transacción * como si * la primera no se haya realizado, pero confirmar * como si * el segundo no comenzó hasta que el primero terminó. –
¿Qué te hace pensar que esto es activerecord específico?si realiza una tarea similar desde la interfaz de línea de comandos de la base de datos, ¿el resultado es diferente? –
@FrederickCheung Depende del SQL que use. Si fuera 'SELECCIONAR ... PARA ACTUALIZAR ', sería diferente. Aún no es lo que OP espera. Pero entonces sería un bloqueo pesimista: http://api.rubyonrails.org/classes/ActiveRecord/Locking/Pessimistic.html –