事务管理
所有 SmartEDB 数据库访问均在事务内执行,以通过强制实施 ACID 原则来确保数据库的完整性(有关事务处理的详细说明,请参阅 SmartEDB 用户指南)。在使用 SmartESQL API 时,事务处理是隐式的,即运行时会自动启动和提交事务,而无需显式调用函数。具体来说,当执行 SQL SELECT 语句时,SqlLocalConnection 或 SqlRemoteConnection 方法的 executeStatement() 会启动并关闭一个只读事务(除非指定了 FOR UPDATE 子句),而在执行 INSERT、UPDATE 或 DELETE 语句时会启动并关闭一个读写事务。同样,executeQuery() 方法会启动并关闭一个只读事务,并返回一个结果集 SqlResultSet。
这些隐式事务由内部的 SqlLocalConnection 或 SqlRemoteConnection 对象进行管理,对于大多数数据库操作,应用程序开发人员无需关注事务接口。不过,某些应用程序需要执行更新操作,这些操作需要跨多个 SmartESQL 函数调用的事务阻塞。
若要通过 SmartESQL 来掌控事务处理,应用程序会使用 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();
检查点和自动检查点
正如 SmartESQL 事务控制页面中所解释的那样,在复杂的事务中,可能需要执行检查点操作,以便在事务提交之前更新索引。可以通过以下方式调用 Java 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;
...