SQL Server(2005/2008/2012)是否在命令到达后立即执行BEGIN TRANSACTION?
是 - 但是(选项,网络缓冲/ - 延迟,分布式数据库,......) - BEGIN TRANSACTION命令以及随后的所有内容都可能被保留,例如。其他事情必须先发生?
此外,是否有可能 - 当数据库/网络导致缓冲/延迟时 - 两个事务将以相反的顺序执行?
答案 0 :(得分:2)
是的,一旦命令到达,事务就会开始,当你提交或回滚时,操作就会相应地完成。
MSDN doc说:
在查询优化期间,SQL Server会查找查询或索引 可能受益于并行执行的操作。对于这些 查询,SQL Server将交换运算符插入到查询中 执行计划以准备并行执行的查询。一个 exchange运算符是查询执行计划中的运算符 提供流程管理,数据重新分配和流量控制。 交换运营商包括Distribute Streams,Repartition Streams和Streams逻辑运算符作为子类型,一个或多个 其中可以出现在查询计划的Showplan输出中 并行查询。
您可以并行执行查询,但是一旦查询开始,除非您没有更改隔离级别或者如果有任何错误,那么您无法更改查询的执行。因此,简而言之,您无法让其他查询等待第一个查询执行。
此外,是否有可能 - 当数据库/网络导致缓冲/延迟时 - 两个事务将以相反的顺序执行?
据我所知,您无法更改查询的执行顺序,即更改顺序或更改代码/查询。
答案 1 :(得分:1)
当服务器获得BEGIN TRAN消息时,它开始保留资源并执行命令。如果另一个事务到达需要一些相同的资源,则需要等到第一个事务释放这些资源,通常使用COMMIT。
这可以通过更改服务器隔离级别来改变,但通常是按照接收顺序执行的事务。
如果用户从不同位置进行更改,网络问题可能会导致交易更改订单。但是,一旦事务到达服务器,如果它们使用相同的对象,就没有理由它会颠倒顺序。
此行为是 ACID 中的 C :一致性。
交易可能无序执行,但前提是他们没有访问相同的资源。