SQL Server:事务执行总是立即执行吗?

时间:2015-10-15 12:10:31

标签: sql sql-server transactions

SQL Server(2005/2008/2012)是否在命令到达后立即执行BEGIN TRANSACTION?

是 - 但是(选项,网络缓冲/ - 延迟,分布式数据库,......) - BEGIN TRANSACTION命令以及随后的所有内容都可能被保留,例如。其他事情必须先发生?

此外,是否有可能 - 当数据库/网络导致缓冲/延迟时 - 两个事务将以相反的顺序执行?

2 个答案:

答案 0 :(得分:2)

是的,一旦命令到达,事务就会开始,当你提交或回滚时,操作就会相应地完成。

MSDN doc说:

  

在查询优化期间,SQL Server会查找查询或索引   可能受益于并行执行的操作。对于这些   查询,SQL Server将交换运算符插入到查询中   执行计划以准备并行执行的查询。一个   exchange运算符是查询执行计划中的运算符   提供流程管理,数据重新分配和流量控制。   交换运营商包括Distribute Streams,Repartition   Streams和Streams逻辑运算符作为子类型,一个或多个   其中可以出现在查询计划的Showplan输出中   并行查询。

您可以并行执行查询,但是一旦查询开始,除非您没有更改隔离级别或者如果有任何错误,那么您无法更改查询的执行。因此,简而言之,您无法让其他查询等待第一个查询执行。

  

此外,是否有可能 - 当数据库/网络导致缓冲/延迟时 - 两个事务将以相反的顺序执行?

据我所知,您无法更改查询的执行顺序,即更改顺序或更改代码/查询。

答案 1 :(得分:1)

当服务器获得BEGIN TRAN消息时,它开始保留资源并执行命令。如果另一个事务到达需要一些相同的资源,则需要等到第一个事务释放这些资源,通常使用COMMIT。

这可以通过更改服务器隔离级别来改变,但通常是按照接收顺序执行的事务。

如果用户从不同位置进行更改,网络问题可能会导致交易更改订单。但是,一旦事务到达服务器,如果它们使用相同的对象,就没有理由它会颠倒顺序。

此行为是 ACID 中的 C :一致性。

交易可能无序执行,但前提是他们没有访问相同的资源。