当我们必须使用几个不同的SELECT查询从数据库中的不同位置获取数据时,如何确保它们与查询(如INSERT、UPDATE或DELETE )隔离,以确保所选数据彼此一致,并且在之间不发生更改?
我知道我可以使用事务来实现插入、更新和删除的相同效果,所以所有更改都可以作为一个整体应用。但它是否也隔离了选择?
例如,3个SELECT查询返回3个不同的值,或者:
1、3、5
或者:
2,4,8
3更新查询不断切换值。如何确保我得到:
1、3、5
或者:
2,4,8
但两者之间没有任何东西,如: 2,3,5,或2,4,5等。
我知道我可以在交易中得到这些更新,但我想再检查一遍。
所以,如果我把这3个选择放在一个事务中,会有效吗?
发布于 2015-03-04 13:00:45
你在问如何“始终如一”地读取数据库。这些事项由事务隔离级别决定。你想要REPEATABLE READ
这是
InnoDB的默认隔离级别。对于一致读取,与READ COMMITTED隔离级别有一个重要的区别:在同一事务中所有一致的读取都读取第一次读取所建立的快照。这个约定意味着,如果在同一个事务中发出几个普通(非锁定)SELECT语句,这些SELECT语句也是一致的。见第14.2.7.2节,“一致的非锁定读取”。
所以,是的,如果您将SELECT语句放在一个事务中--只要事务的隔离级别是REPEATABLE READ (默认),它就能工作。
发布于 2015-03-04 12:45:19
是。通常情况下,事务会防止这种情况发生。查找dbms的事务隔离级别。例如,对于mysql,请参见:http://dev.mysql.com/doc/refman/5.6/en/dynindex-isolevel.html,当然,更改所有三个值的update语句必须在一个事务中。如果它们在三个不同的事务中,那么您的select就可以捕获更新之间的状态。
https://stackoverflow.com/questions/28854741
复制相似问题