MySQL 事务提交应用查询还是结果?
Do MySQL transaction commits apply queries, or results?
如果我开始一个事务,运行 一些查询,然后提交它,提交是通过应用查询结果还是查询本身来工作?
例如,如果我的事务包含 insert into b select x from a
,并且在我 运行 这个查询之后但在我提交事务之前 x 发生了变化,结果将是 x 的值,因为它是在事务,或者提交时 x 的值?
答案: x
将具有读取时间戳时的值。
更具体地说,commit是事务的一部分,所以在事务期间或commit时,你不能将其称为,它们不是两个独立的操作。
澄清:使用事务将确保事务边界内的所有操作在外界看来是原子。
原子操作意味着:
操作要么成功,要么失败。中间不能有中间步骤。特别是,如果事务启动并发生故障(如断电),它需要回滚到目前为止所做的所有更改。
这也意味着外界应该将其视为一个单一的操作。如果事务使用某些值,则所有值都应从事务开始时的时间戳中获取。类似地,交易应该进行的所有更改都将在交易结束的时间戳之后立即对外界可用。这是通过交易中涉及的适当形式的锁定(独占、读取或写入)table 来实现的。
因此,为了更具体地说明您的问题,当在事务中调用 select x from a
时,table a
被锁定,直到事务提交或回滚。你提到的场景,x在我运行这个查询之后发生变化(在交易commits/rolled返回之前),实际上是不可能的.
如果我开始一个事务,运行 一些查询,然后提交它,提交是通过应用查询结果还是查询本身来工作?
例如,如果我的事务包含 insert into b select x from a
,并且在我 运行 这个查询之后但在我提交事务之前 x 发生了变化,结果将是 x 的值,因为它是在事务,或者提交时 x 的值?
答案: x
将具有读取时间戳时的值。
更具体地说,commit是事务的一部分,所以在事务期间或commit时,你不能将其称为,它们不是两个独立的操作。
澄清:使用事务将确保事务边界内的所有操作在外界看来是原子。
原子操作意味着:
操作要么成功,要么失败。中间不能有中间步骤。特别是,如果事务启动并发生故障(如断电),它需要回滚到目前为止所做的所有更改。
这也意味着外界应该将其视为一个单一的操作。如果事务使用某些值,则所有值都应从事务开始时的时间戳中获取。类似地,交易应该进行的所有更改都将在交易结束的时间戳之后立即对外界可用。这是通过交易中涉及的适当形式的锁定(独占、读取或写入)table 来实现的。
因此,为了更具体地说明您的问题,当在事务中调用 select x from a
时,table a
被锁定,直到事务提交或回滚。你提到的场景,x在我运行这个查询之后发生变化(在交易commits/rolled返回之前),实际上是不可能的.