在PostgreSQL上为Django配置REPEATABLE READ或SERIALIZED transaction



我有一个基于django的webapp,通过psycopg2使用PostgreSQL作为后端。现在我们使用的是postgres 8.4。X,但将移动到9.1。未来的X。我们使用的是Django当前的稳定版本1.3.1。

我想在REPEATABLE READ或SERIALIZABLE级别启用更严格的事务隔离(按照postgres文档)。在psycopg2源代码中,可用的选项有:

"""Isolation level values."""
ISOLATION_LEVEL_AUTOCOMMIT          = 0
ISOLATION_LEVEL_READ_UNCOMMITTED    = 1
ISOLATION_LEVEL_READ_COMMITTED      = 2
ISOLATION_LEVEL_REPEATABLE_READ     = 3
ISOLATION_LEVEL_SERIALIZABLE        = 4

不幸的是,Django 1.3.1的psycopg2后端_set_isolation_level()的实现包括assert level in (0, 1),这似乎排除了使用这种方法来设置隔离级别,如我现在想要的。

在最近提交到Django的主干中,很高兴看到这个限制已经放宽到允许4级,但是,似乎仍然没有一个选项通过正常的Django设置来实际指示后端你想要一个比ISOLATION_LEVEL_READ_COMMITTED更高的隔离级别。换句话说,虽然_set_isolation_level()现在将接受最高为4的级别,但没有基于配置的方法实际导致以4作为参数调用它。

问题:

  • 假设我愿意开始使用Django的开发版本来获得这个更改,那么如果没有配置选项会导致它被我想要的隔离级别调用,那么手动调用_set_isolation_level()的正确/推荐方法是什么?

  • 假设我愿意使用Django的devel版本,使用Django 1.3.1将所需的隔离级别传递给psycopg2的推荐方法是什么?

  • 当前和未来的Django版本是否会因为这些更高的隔离级别在实践中导致巨大的问题而使其难以指定?(也就是说,我应该这样做吗?)请记住,我们的应用程序具有相对较低的数据库吞吐量,具有大量,不频繁的事务,并且具有极高的一致性要求。

提前感谢您的建议

最简单和最兼容的方法是编写自己的DB适配器,它继承django的默认设置并覆盖这些方法,以便您设置自己的隔离级别

这似乎很奇怪。AUTOCOMMIT不是事务隔离级别。READ COMMITTED是PostgreSQL的默认值,如果是1或者2,你会得到READ COMMITTED的行为。

我认为你正在寻找set_session([isolation_level,] [readonly,] [deferred,] [autocommit]).

当前和未来的Django版本是否都使它难以指定这些更高的隔离级别因为它们会造成巨大的问题实践?

据我所知,问题更多的是与MySQL和向后兼容性有关,而不是与PostgreSQL有关。MySQL默认为REPEATABLE READ;一些Django开发人员认为READ COMMITTED行为并没有经过彻底的测试。

https://code.djangoproject.com/ticket/13906

最新更新