我们有一些复杂的设置:
在我们的普通代码中,我们手动连接到mysql数据库。我们这样做是因为我猜django通常使用的连接不是线程安全的吗?所以我们让django建立连接,从中提取信息,然后使用mysqldb连接进行实际的查询。
我们的代码主要是一个更新过程,因此我们关闭了自动提交以节省时间。
为了便于创建测试数据,我创建了表示表的django模型,并使用它们创建要测试的行。所以我的功能如下:
def make_thing(**overrides):
fields = deepcopy(DEFAULT_THING)
fields.update(overrides)
s = Thing(**fields)
s.save()
transaction.commit(using='ourdb')
reset_queries()
return s
然而,它似乎并没有实际提交!在我创建一个对象后,我后来有代码对mysqldb连接执行原始sql:
def get_information(self, value):
print self.api.rawSql("select count(*) from thing")[0][0]
query = 'select info from thing where column = %s' % value
return self.api.rawSql(query)[0][0]
此打印语句打印0!为什么呢?
另外,如果我关闭自动提交,我会得到
TransactionManagementError: This is forbidden when an 'atomic' block is active.
当我们稍后尝试更改自动提交级别时。
编辑:我也尝试了https://groups.google.com/forum/#!topic/django-users/4lzsQAWYwG0,但没有帮助。
EDIT2:我从shell检查数据库 - 提交 正在工作,它只是没有被提起。我已经尝试设置事务隔离级别,但它没有帮助。我应该补充说,get_information中的一个函数使用了这个装饰器:
def single_transaction(fn):
from django.db import transaction
from django.db import connection
def wrapper(*args, **kwargs):
prior_autocommit = transaction.get_autocommit()
transaction.set_autocommit(False)
connection.cursor().execute('set transaction isolation level read committed')
connection.cursor().execute("SELECT @@session.tx_isolation")
try:
result = fn(*args, **kwargs)
transaction.commit()
return result
finally:
transaction.set_autocommit(prior_autocommit)
django.db.reset_queries()
gc.collect()
wrapper.__name__ = fn.__name__
return wrapper