django/innodb——旧会话和事务的问题



我们刚刚将MySQL数据库从MyIsam切换到Innodb,我们看到Django中出现了一个奇怪的问题。每当我们进行数据库事务时,现有会话都不会拾取它。。。曾经我们可以从mysql终端看到数据库中的新记录,但现有的django会话(即已经打开的shell)不会注册更改。例如:

外壳1:

>>> my_obj = MyObj.objects.create(foo="bar")
>>> my_obj.pk
1

外壳2(在上述之前打开)

>>> my_obj = MyObj.objects.filter(pk=1)
[]

Shell 3(MySQL):

mysql> select id from myapp_my_obj where id = 1;
id
1

有人知道为什么会发生这种事吗?

编辑:为了澄清,Shell 2是在Shell 1之前打开的,然后我创建了Shell 1,然后我试图查看我在Shell 2中创建的对象。

编辑2:总体情况是,我有一个芹菜任务,它被从创建的对象传递主键。当我使用MyISAM时,它每次都会找到它,现在它抛出ObjectDoesNotExist,尽管我可以看到对象是在数据库中创建的。

create()命令为当前shell提交事务,但不对第二个shell中的事务执行任何操作。

https://docs.djangoproject.com/en/dev/topics/db/transactions/

你的第二个线程看不到第一个线程做了什么,因为它在自己的事务中。事务隔离数据库,以便在提交事务时,所有事情都发生在一个时间点,包括select语句。这是ACID中的A。尝试运行

from django.db import transaction; transaction.commit()

在第二外壳中。这应该提交当前事务并启动一个新事务。如果您没有修改当前shell中的数据库中的任何内容,那么您也可以使用transaction.rollback()来实现同样的事情。

编辑编辑:

您可能需要获取特定的数据库连接才能实现此功能。试试这个:

import django.db
django.db.connection._commit() 

有关此问题的更多信息,请点击此处:

http://groups.google.com/group/django-users/msg/55fa3724d2754013

相关位为:

如果您希望script1.py(使用InnoDB表)从您可以更改事务隔离级别的其他事务,如下所示:从django.db导入连接connection.cursor().execute('设置事务隔离级别读取已提交")或者,您可以启用数据库版本的自动提交"提交"查询以及更新,因此script1的每个新查询都将在自己的交易中:connection.cursor().execute('set autocommit=1')任何一个都允许script1查看script2的更新。

所以,tl;dr是您需要将InnoDB事务隔离设置为READ-COMMITTED

相关内容

  • 没有找到相关文章

最新更新