Rails的PostgreSQL的如何设置事务隔离级别序列化

我有一个belongs_to的主题模型评论模式。 在评论的模式,我有一个before_create回调

def on_create Topic.transaction(:require_new => true) do Topic.connection.execute('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE') self.topic.increment!(:comment_counter) if conditions end end

问题是,我得到ActiveRecord::StatementInvalid: PGError: ERROR: SET TRANSACTION ISOLATION LEVEL must be called before any query

是否有另一种方式来设置的事务隔离级别?

--------------解决方案-------------

PostgreSQL的要求SET TRANSACTION交易开始后执行的语句和之前的任何DML(SELECT,INSERT,DELETE等)语句。 从文档,它看起来像所有的东西必须通过连接对象,而不是交易对象来完成。 喜欢的东西(未经测试)

Topic.connection.begin_db_transaction
Topic.connection.execute('SET TRANSACTION ISOLATION LEVEL SERIALIZABLE')
# Other things go here. I'd test with another literal SQL statement to make
# sure it works like I'd hope it does. Then possibly try rewriting in Rails.
Topic.connection.commit_db_transaction

真希望我是错了。

过一个不愉快的替代方法是更改​​PostgreSQL服务器上的所有事务的默认隔离级别。 (搜索http://www.postgresql.org/docs/current/static/runtime-config-client.html为“default_transaction_isolation”。)但是,这感觉就像用大炮杀死一只苍蝇。

您可能会发现transaction_isolation宝石有​​所帮助:https://github.com/qertoip/transaction_isolation

由于导轨4, #transaction提供了一个:isolation选项:

如果你的数据库支持设置的隔离级别的事务,你可以设置它像这样:

Post.transaction(isolation: :serializable) do
# ...
end

分类:Ruby on Rails的 时间:2012-01-01 人气:2
分享到:

相关文章

  • 使用Ruby on Rails和PostgreSQL的记录二级伪随机唯一的密钥 2012-10-31

    我想补充的辅助生成的密钥为我目前使用PostgreSQL数据库的Ruby on Rails的应用程序表. 如果可能的话,我想是数据库无关. 我们的目标是为使用网址此键,以便外部用户无法猜测数据库的大小或各类型的我的记录量. 我知道的UUID,但它们是长和矫枉过正. 此外,该领域应建立索引,据我所知,在索引随机数据是有问题的. 如果没有干净的解决方案,我只是做一个小公式应用到ID,并确保我检查碰撞和避免他们. 但我敢肯定,我不是有这个问题的第一个. --------------解决方案------

  • Ruby on Rails的/ PostgreSQL的 - 库无法启动服务器 - libq.5.dylib时加载错误 2012-01-12

    我的应用程序运行的Ruby 1.9.2,Rails的3,和PostgreSQL 8.3. 它最初的设置和在PostgreSQL 9.1的工作,但我卸载了9.1和安装,并改为8.3保证兼容性上Heroku的共享数据库设置. 它运行正常,但现在不 现在,在这个应用程序时,当我运行一个数据库升级我得到这个错误: dlopen(/Users/michaeljmccoy/.rvm/gems/ruby-1.9.2-p290/gems/pg-0.12.2/lib/pg_ext.bundle, 9): Libr

  • BY子句添加表列到组 - Ruby on Rails的 - PostgreSQL的 2012-08-05

    我想使用Heroku和显然PostgreSQL是很多比SQL聚集函数更加严格. 当我推到Heroku的我得到一个错误,说明了下文. 在另一个问题,我问我收到了一些指导,这说我应该只是列添加到我的group by子句,我不知道该怎么做. 请参见下面的完整的错误和PostsControll#指数. SELECT posts.*, count(*) as vote_total FROM "posts" INNER JOIN "votes" ON votes.post_id

  • Ruby on Rails和PostgreSQL的扩展和负载平衡(硬件和设置建议)? 2012-09-09

    我们想要什么: 我找了硬件,红宝石版和PostgreSQL复制方法的建议缩放on Rails应用程序红宝石,目前位于1服务器上. 我们用它来 ​​什么: 在我工作的公司目前拥有处理数据库和我们的Rails应用程序的红宝石1服务器. 我们的应用程序以大约每5秒的速度发生在GPS和其他数据来自许多不同的地点(移动设备等). 经过广泛的测试,我们已经准备好部署,但要几百/几千设备将数据发送到服务器的准备. 至于用户互动,我们有报告等的基础上发布的数据可用. 我目前倾向于PostgreSQL的主 - 主

  • Ruby on Rails的PostgreSQL的+:自定义序列的使用 2014-09-28

    说我有一个模式叫Transaction具有:transaction_code属性. 我想那个属性被自动填充它可能不同于序号id (如交易与id=1可以有transaction_code=1000 ). 我试图创建一个Postgres的序列,然后正在为默认值transaction_code列nextval该序列. 问题是,如果我没有任何值分配给@transaction.transaction_code的回报率,当我发出了一个@transaction.save的回报率,它会尝试做以下SQL: INS

  • Ruby on Rails的after_remove,after_add回调上的has_many:通过 2012-09-14

    我有符合以下模式的典范: class foo < ActiveRecord::Base has_many :bar, :dependent => :destroy has_many :baz, :through => :bar, :uniq => true, :after_add => :update_baz_count, :after_remove => :update_baz_count def update_baz_count(record) debugger #

  • 优雅的PostgreSQL集团通过为Ruby on Rails的/ ActiveRecord的 2012-03-28

    尝试检索按日期PostgreSQL的分组ActiveRecord对象的数组. 更具体地说我想翻译以下MySQL查询: @posts = Post.all(:group => "date(date)", :conditions => ["location_id = ? and published = ?", @location.id, true], :order => "created_at DESC") 我知道的SQL标准的Po

  • Ruby on Rails的回调,是什么区别:与before_save:before_create? 2012-04-04

    您能详细解释一下:before_save和:before_create Ruby on Rails的回调,他们有使用Rails验证做什么? 验证确实发生之后:before_save或:before_create ? --------------解决方案------------- 在根据Rails的创建操作,也有对数据库的操作前6回调,二经. 为了,它们是: before_validation before_validation_on_create after_validation after_v

  • Ruby on Rails的从SQLite数据库向PostgreSQL开关给出了零未定义的方法`to_sym':NilClass错误 2012-09-19

    我工作所使用的设计验证系统一个Ruby on Rails应用程序. https://github.com/plataformatec/devise 我搜遍互联网类似的问题我自己,但没有无济于事. 我想给你一些背景知识,这一切都开始了2个独立的应用程序. 其中之一是使用色器件. 我目前正在尝试这两个应用程序混入之一. 即使把模型视图并在他们需要我的控制器之后没有遇到任何问题. 但是,我们需要从一个sqlite3的数据库切换到一个PostgreSQL之一. 当我修改database.yml文件,以指

  • 如何处理Ruby on Rails的错误:“请安装PostgreSQL的适配器:`安装了activerecord-PostgreSQL的适配器'” 2013-08-03

    运行Ruby on Rails的(回报率)的应用程序或Ruby代码,使用ActiveRecord的框架,你会得到错误信息: 请安装PostgreSQL的适配器: gem install activerecord-postgresql-adapter 试图运行: gem install activerecord-postgresql-adapter 也失败了,让你不知所措. --------------解决方案------------- 问题不在于别人怎么写. 问题是,PostgreSQL数据库适

Copyright (C) 55228885.com, All Rights Reserved.

55228885 版权所有 京ICP备15002868号

processed in 0.189 (s). 10 q(s)