En mi clase de fotos tengo esta asociación.¿Rieles cómo tocar el objeto de registro activo sin bloquear?
belongs_to :user, :touch => true
Un día recibí esta excepción.
A ActiveRecord::StatementInvalid occurred in photos#update:
Mysql::Error: Deadlock found when trying to get lock; try restarting transaction:
UPDATE `users` SET `updated_at` = '2011-09-20 14:17:44' WHERE `users`.`id` = 6832
production/ruby/1.8/gems/activerecord-3.0.10/lib/active_record/connection_adapters/abstract_adapter.rb:207:in `log'
¿Qué debo hacer para evitar futuras excepciones como esta? Me gustaría que la declaración de actualización que se muestra en el error no use bloqueo si es posible. No creo que usar el bloqueo optimista funcione en este caso porque el bloqueo optimista probablemente generaría un ActiveRecord :: StaleObjectError en su lugar.
Gracias por la respuesta. Han pasado 2 años y no estoy del todo seguro de por qué estaba usando el tacto. Invalidar el caché parece una buena razón. Ahora uso barredoras para caducar las entradas de caché. http://guides.rubyonrails.org/caching_with_rails.html#sweepers. Ya no uso el tacto en ningún lado. –
Me gusta la idea de valid_from, pero creo que también necesita agregar el nombre de clase en cache_key, por ejemplo [class]/[id] - [timestamp] según http://signalvnoise.com/posts/3113- how-key-based-cache-expiration-works – iheggie