2016-06-08 53 views
0

如果我想在事务块中写入多个SQL语句,并确保该块的所有ACID属性都被遵循,那我该如何实现?在django交易中如何提供ACID属性?

示例 - 当我使用transaction.atomic时,它为该代码块提供原子性,但它是否提供并发控制和隔离(表级别或行级别)?

我目前使用PostgreSQL和我设置隔离级别ISOLATION_LEVEL_SERIALIZABLE

这是否为我提供了transaction.atomic块的序列化交易?

如果不这样做,它是如何做到的?

回答

1

Django的transaction.atomic是通过使用数据库事务实现的,因此数据库为其事务提供的任何保证也将由Django的原子块提供。所以要回答你的问题,是的。

虽然Django使用保存点支持嵌套的原子块,并且事务块和保存点块之间存在差异 - 具体而言,相同外部事务中的后来异常将导致成功完成的保存点阻止回滚。

+0

对不起,花了时间来测试这个。 transaction.atomic只是承诺其全部或全部查询都不会运行。无论我选择什么样的数据库设置。 – RA123

+0

@ RA123:如果您遇到问题,我建议您发布关于此问题的具体问题并获得帮助。编程中的各种各样的东西都可能出错,使您无法获得预期的结果。但是你问了一个非常普遍的问题,答案是Django通过使用底层数据库的事务(和隔离级别)实现'transaction.atomic'。 –