事务管理
注
仅适用于 Windows 系统上的 .NET Framework 4.x 和 .NET 8(原 .NET Core)。
所有 SmartEDB 数据库访问都在事务中执行,以确保数据库的 ACID 完整性(详情参见 SmartEDB 用户指南)。使用 SmartESQL API 时,事务处理是隐式的,即运行时会自动管理事务,无需显式调用。具体来说:
- ExecuteStatement() 方法在执行 SQL SELECT 语句时(除非指定了 FOR UPDATE 子句)启动并关闭只读事务;在执行 INSERT、UPDATE 或 DELETE 语句时启动并关闭读写事务。
- ExecuteQuery() 方法启动并关闭只读事务,并返回结果集 SqlResultSet。
这些隐式事务由 SqlLocalConnection 或 SqlRemoteConnection 内部管理,大多数情况下开发人员无需关注事务接口。然而,某些应用程序需要跨越多个函数调用的事务阻塞。
要控制事务处理,应用程序可以使用 SqlLocalConnection 或 SqlRemoteConnection 的 StartTransaction()、CommitTransaction() 或 RollbackTransaction() 方法。此外,CheckpointTransaction() 方法可以在事务打开时更新索引并使对象对查询可见。以下代码片段展示了这一过程。
SqlLocalConnection con = db.ConnectSql();
con.StartTransaction(Database.TransactionType.ReadWrite);
con.ExecuteStatement("insert into MyTable (pk,value) values (?,?)", 2012, "Good bye");
con.ExecuteStatement("insert into MyTable (pk,value) values (?,?)", 2013, "Hello");
con.CommitTransaction();
检查点和自动检查点
正如“事务控制”页面中所解释的,在复杂的事务中,可能需要执行检查点操作,以便在事务提交之前更新索引。可以通过以下方式调用 C# API 来触发检查点:
SqlLocalConnection con = db.ConnectSql();
con.StartTransaction(Database.TransactionType.ReadWrite);
con.ExecuteStatement("insert into MyTable (pk,value) values (?,?)", 2012, "Good bye");
con.CheckpointTransaction();
SqlResultSet result = conn.ExecuteQuery("SELECT * FROM MyTable WHERE pk=?", 2012);
con.CommitTransaction();
或者可以使用以下 SQL 语句来触发检查点:
con.ExecuteStatement("CHECKPOINT TRANSACTION");
要启用自动检查点功能,请在数据库参数模式中设置 DB_SQL_AUTOCHECKPOINT 标志。例如:
Database.Parameters parameters = new Database.Parameters();
parameters.Mode = Database.DB_SQL_AUTOCHECKPOINT;
...