У меня есть следующий фрагмент кода в приложении Rails 3.2 + MySql:Rails ActiveRecord сеанс связи
ActiveRecord::Base.connection.execute("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED")
ActiveRecord::Base.transaction do
@book = ActiveRecord::Base.connection.execute("select * from books limit 1")
end
Насколько я понимаю, что первое утверждение приведет к следующему транзакции внутри одного сеанса, чтобы быть в " READ UNCOMMITTED ", а затем изоляция вернется к умолчанию.
Мои вопросы: могу ли я быть уверенным, что блок транзакций всегда будет выполнен в том же сеансе? Кроме того, могу ли я быть уверенным, что никакая другая транзакция не будет проходить в том же сеансе между первым и вторым операциями?
Я пробовал Google для этой темы, но поскольку я новичок в Rails, я не мог найти объяснений, которые бы это поняли для меня. Любая помощь будет оценена!
Спасибо!
Спасибо. Это помогает! Да, похоже, что у Rails 4 есть лучшее решение для этого, но, к сожалению, сейчас я не могу перейти на Rails 4 с текущим проектом. –
Следующий вопрос: нужно ли обертывать заявление в транзакционном блоке, как в коде? Будет ли изоляция по-прежнему работать должным образом, если я просто выполню sql-оператор без транзакционного блока? –
Да, как объяснено [здесь] (http://dev.mysql.com/doc/refman/5.7/en/set-transaction.html), параметр изоляции действителен для следующего блока транзакций. Даже установка изоляции на уровне сеанса действительна только для всех последующих транзакционных блоков. – BoraMa