Microsoft Fabric 仓库表中的事务
适用于:✅SQL 分析终结点和 Microsoft Fabric 中的仓库
与 SQL Server 中的行为类似,事务允许你控制读取和写入查询的提交或回滚。
可以使用事务将更改分组在一起,修改存储在仓库表中的数据。
- 例如,可以向多个表提交插入,或者如果出现错误,则不向任何表提交插入。 如果要更改影响三个表的采购订单的详细信息,则可以将这些更改分组到单个事务中。 这意味着当查询这些表时,它们要么全部有更改,要么没有任何更改。 当需要确保多个表中的数据一致时,事务是一种常见做法。
事务功能
Microsoft Fabric 中的 SQL 分析终结点支持相同的事务功能,但适用于只读查询。
事务还可以用于顺序 SELECT 语句,以确保所涉及的表都具有来自同一时间点的数据。 例如,如果表包含由另一个事务添加的新行,则新行不会影响打开的事务中的 SELECT 查询。
重要
Microsoft Fabric 仅支持快照隔离级别。 如果使用 T-SQL 更改隔离级别,则会在查询执行时忽略更改,并应用快照隔离。
跨数据库查询事务支持
Microsoft Fabric 中的仓库支持跨越同一工作区中的数据库的事务,包括从湖屋的 SQL 分析终结点读取数据。 每个湖屋都有一个只读 SQL 分析端点。 每个工作区可以有多个湖屋。
事务中的 DDL 支持
Microsoft Fabric 中的仓库支持 DDL,例如用户定义事务内的 CREATE TABLE。
不同类型语句的锁
此表提供了用于不同类型的事务的锁的列表,所有锁都位于表级别:
语句类型 | 已锁定 |
---|---|
SELECT | 架构稳定性 (Sch-S) |
INSERT | 意向排他 (IX) |
DELETE | 意向排他 (IX) |
UPDATE | 意向排他 (IX) |
COPY INTO | 意向排他 (IX) |
DDL | 架构修改 (Sch-M) |
这些锁可以防止冲突,例如在事务中更新行时更改表的架构。
可以使用动态管理视图 (DMV) sys.dm_tran_locks 查询当前持有的锁。
更新表中的一行或多行的两个或多个并发事务产生的冲突将在事务结束时进行评估。 要提交的第一个事务将成功完成,其他事务将回滚并返回错误。 这些冲突在表级别而不是单个 parquet 文件级别进行评估。
INSERT 语句始终会创建新的 parquet 文件,这意味着与其他事务(DDL 除外)的冲突更少,因为表的架构可能会更改。
事务日志记录
Microsoft Fabric 仓库中的事务日志记录位于 parquet 文件级别,因为 parquet 文件是不可变的(它们无法更改)。 回滚会导致指向上一个 parquet 文件。 此更改的优点是事务日志记录和回滚速度更快。
限制
- 不支持分布式事务。
- 不支持保存点。
- 不支持命名事务。
- 不支持标记事务。
- 显式事务中不支持 ALTER TABLE。
- 目前,仓库中的 T-SQL 功能有限。 有关当前不可用的 T-SQL 命令的列表,请参阅 TSQL 外围应用。
- 如果事务将数据插入空表并在回滚前发出 SELECT,则自动生成的统计信息仍可能反映未提交的数据,从而导致统计信息不准确。 不准确的统计信息可能导致查询计划和执行时间未优化。 如果在大型 INSERT 之后使用 SELECT 回滚事务,则请更新 SELECT 中提到的列的统计信息。