当我们必须使用几个不同的SELECT查询从数据库中的不同位置获取数据时,如何确保它们与INSERT,UPDATE或DELETE等查询隔离,以便我们可以确保所选数据与彼此之间并没有改变?
我知道我可以使用事务来实现INSERT,UPDATE和DELETE的相同效果,因此更改将作为一个整体应用。但是它也会隔离SELECT吗?
例如,3个SELECT查询返回3个不同的值:
1,3,5
或者:
2,4,8
3个更新查询不断切换值。如何确保我得到:
1,3,5
或者:
2,4,8
但两者之间没有任何东西,如:2,3,5,也不是2,4,5等。
我知道我可以在交易中获得这些更新,但我想要仔细检查。
如果我将这3个SELECT放在一个事务中,它会起作用吗?
答案 0 :(得分:3)
您正在询问如何“始终如一”地阅读数据库。这些问题由transaction isolation level确定。你想要REPEATABLE READ
:
这是
InnoDB
的默认隔离级别。对于consistent reads,与READ COMMITTED
隔离级别存在重要差异:同一事务中的所有一致性读取读取第一次读取建立的快照。此约定意味着如果在同一事务中发出多个普通(非锁定)SELECT
语句,则这些SELECT
语句也相互一致。请参阅Section 14.2.7.2, “Consistent Nonlocking Reads”。
所以,是的,如果您将SELECT
语句放在单个事务中,只要事务的隔离级别为REPEATABLE READ
(默认值),它就会起作用。
答案 1 :(得分:1)
是。通常情况下,交易会阻止这种情况。查找dbms的事务隔离级别。以mysql为例,请参阅: http://dev.mysql.com/doc/refman/5.6/en/dynindex-isolevel.html 当然,更改所有三个值的更新语句必须在一个事务中。如果它们处于三个不同的事务中,那么您的select可以捕获更新之间的状态。