【问题标题】:How to set a Ruby on Rails 4+ app's default db isolation level如何设置 Ruby on Rails 4+ 应用程序的默认数据库隔离级别
【发布时间】:2015-04-11 21:33:00
【问题描述】:

我想让我的应用程序默认为每笔交易serialize。然后,我会根据性能测量和了解特定操作/事务使用和更改的数据来放松隔离。

我怀疑默认情况下可序列化会进入框架,因为它会减慢速度并且难以解释。但我不想处理数据库损坏,并且确实想要内部一致的聚合计算。

针对具体情况的隔离级别有 Rails postgresql how to set transaction isolation level to serializable,但我认为这种方法是错误的,原因与 html-escaping 以防止 xss 错误并被删除的原因相同:白名单比黑名单更安全。

有人已经这样做了吗? 在哪里可以挂上铁轨来做到这一点?

【问题讨论】:

    标签: mysql ruby-on-rails postgresql isolation-level transaction-isolation


    【解决方案1】:

    如果你想要这个默认值,那么我建议在你的 MySQL 配置中设置它。该设置在此处描述:https://dev.mysql.com/doc/refman/5.7/en/server-options.html#option_mysqld_transaction-isolation

    [mysqld]
    default-character-set = utf8
    default-storage-engine = InnoDB
    default-table-type = InnoDB
    transaction-isolation = SERIALIZABLE
    

    对于 PostgreSQL,该设置称为 default_transaction_isolation。您可以在postgresql.conf 中设置。

    【讨论】:

    • 可以在数据库而不是整个 DBMS 上设置吗?它不适合我们的用例,因为我们使用的是托管服务,无法访问配置文件,但仍然很有趣。
    • 对于 MySQL,您可以使用 SET TRANSACTION。您可以尝试SET GLOBAL TRANSACTION,但如果您只有受限的数据库访问权限,我不确定这是否可行。但是,您也可以调用SET SESSION TRANSACTION 作为第一个 SQL 语句,这应该可以解决问题。我不完全确定如何,但您可能会挂接到在 Rails 创建新数据库连接后运行的东西。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-07-29
    • 2011-03-31
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-08-02
    相关资源
    最近更新 更多