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