使用多数据库的 Django 事务
Django transaction using multi-db
我有三个数据库,我想根据一个请求在事务中向它们添加数据。
例如我的代码。
@transaction.commit_manually
def my_view(request):
try:
MyModel_one(...).save(using='default')
MyModel_two(...).save(using='db_one')
MyModel_three(...).save(using='db_two') # <-- for example we make exception here (duplicate data)
except IntegrityError:
transaction.rollback()
transaction.rollback(using='db_one')
transaction.rollback(using='db_two')
return ...
transaction.commit()
transaction.commit(using='db_one')
transaction.commit(using='db_two')
return ...
结果:
- MyModel_one — 数据未保存
- MyModel_two — 数据已保存(我不明白为什么)
- MyModel_three — 数据没有保存,因为希望错误
问题:为什么交易在这里不起作用?我该怎么做才能获得工作交易?
(我尝试用其他方法但没有成功结果)
(我也明白这不是很好的代码,但对于理解问题来说非常简单)
Django 1.7.7
Python2.7
数据库:
默认值——postgres
db_one — mysql
db_two — mysql
Django 1.6 中的transaction.commit_manually
decorator was deprecated。你应该切换到 Django 的新事务管理。
我认为你不需要手动提交事务,你可以嵌套transaction.atomic
。
def my_view(request):
try:
with transaction.atomic(using='default'):
with transaction.atomic(using='db_one'):
with transaction.atomic(using='db_two'):
MyModel_one(...).save(using='default')
MyModel_two(...).save(using='db_one')
MyModel_three(...).save(using='db_two') # raises exception
except IntegrityError:
return ...
return ...
我有三个数据库,我想根据一个请求在事务中向它们添加数据。
例如我的代码。
@transaction.commit_manually
def my_view(request):
try:
MyModel_one(...).save(using='default')
MyModel_two(...).save(using='db_one')
MyModel_three(...).save(using='db_two') # <-- for example we make exception here (duplicate data)
except IntegrityError:
transaction.rollback()
transaction.rollback(using='db_one')
transaction.rollback(using='db_two')
return ...
transaction.commit()
transaction.commit(using='db_one')
transaction.commit(using='db_two')
return ...
结果:
- MyModel_one — 数据未保存
- MyModel_two — 数据已保存(我不明白为什么)
- MyModel_three — 数据没有保存,因为希望错误
问题:为什么交易在这里不起作用?我该怎么做才能获得工作交易?
(我尝试用其他方法但没有成功结果) (我也明白这不是很好的代码,但对于理解问题来说非常简单)
Django 1.7.7 Python2.7
数据库: 默认值——postgres db_one — mysql db_two — mysql
Django 1.6 中的transaction.commit_manually
decorator was deprecated。你应该切换到 Django 的新事务管理。
我认为你不需要手动提交事务,你可以嵌套transaction.atomic
。
def my_view(request):
try:
with transaction.atomic(using='default'):
with transaction.atomic(using='db_one'):
with transaction.atomic(using='db_two'):
MyModel_one(...).save(using='default')
MyModel_two(...).save(using='db_one')
MyModel_three(...).save(using='db_two') # raises exception
except IntegrityError:
return ...
return ...