JetBeginTransaction 函数
适用于: Windows |Windows Server
JetBeginTransaction 函数
JetBeginTransaction 函数会导致会话进入事务并创建新的保存点。 可以在单个会话上多次调用此函数,从而导致创建其他保存点。 这些保存点可用于选择性地保留或放弃对数据库状态的更改。
JET_ERR JET_API JetBeginTransaction(
__in JET_SESID sesid
);
parameters
sesid
用于此调用的会话。
返回值
此函数返回具有以下返回代码之一 的JET_ERR 数据类型。 有关可能的 ESE 错误的详细信息,请参阅 可扩展存储引擎错误 和 错误处理参数。
返回代码 |
说明 |
---|---|
JET_errSuccess |
操作已成功完成。 |
JET_errClientRequestToStopJetService |
无法完成操作,因为由于调用 JetStopService,与会话关联的实例上的所有活动都已停止。 |
JET_errInstanceUnavailable |
无法完成该操作,因为与会话关联的实例遇到一个致命错误,该错误要求撤销对所有数据的访问以保护该数据的完整性。 此错误仅由 Windows XP 和更高版本返回。 |
JET_errNotInitialized |
无法完成操作,因为尚未初始化与会话关联的实例。 |
JET_errRestoreInProgress |
无法完成操作,因为正在与会话关联的实例上执行还原操作。 |
JET_errSessionSharingViolation |
同一会话不能同时用于多个线程。 此错误仅由 Windows XP 和更高版本返回。 |
JET_errTermInProgress |
无法完成操作,因为与会话关联的实例正在关闭。 |
JET_errTransTooDeep |
无法启动新事务,因为会话已处于数据库引擎允许的最大保存点深度。 |
成功后,提供的会话将位于事务内。 如果会话以前在事务中,则将创建新的保存点。
失败时,会话的事务状态将保持不变。 不会更改数据库状态。
备注
数据库引擎为其事务提供快照隔离模型。 这意味着,当会话首次进入事务状态时,会话将在事务开始时看到整个数据库被及时冻结。 会话不需要读取锁定任何数据,因为它始终可以访问该数据的相应版本。 这意味着更新数据的会话永远不会阻止其他会话读取该数据。
使用快照隔离的另一个含义是用于更新的锁定模型。 数据库引擎会将给定数据块的写入锁授予请求该数据的第一个会话。 如果已提交或完全中止事务,使会话不再位于事务中,则会释放此写入锁。 虽然会话具有写入锁,但请求同一写锁的任何其他会话在写入锁可用之前不会阻止。 相反,第二个会话将立即失败并JET_errWriteConflict。 若要解决此冲突,第二个会话必须中止 (或完全提交) 其事务,等待一小段时间,让第一个会话提交或中止其事务,然后重新开始。
为了支持快照隔离,数据库引擎将所有修改的数据版本存储在内存中,因为任何会话上最早的活动事务首次启动。 这对应用程序有重要影响。 任何导致大量版本在内存中累积的行为都可能导致实例耗尽其最大版本存储大小, (查看系统参数中的JET_paramMaxVerPages以获取详细信息) 。 此类行为包括但不限于单个事务中的非常大的更新和长时间运行的事务。 因此,为应用程序的预期事务负载正确配置版本存储大小非常重要。 请务必注意限制在单个事务中执行的更新数。 此外,在高负载情况下,使事务的持续时间尽可能短也很重要。
强烈建议在调用检索或更新数据的 ESE API 时,应用程序始终位于事务的上下文中。 如果未执行此操作,数据库引擎将自动代表应用程序在事务中包装此类型的每个 ESE API 调用。 在某些情况下,这些非常短的事务的成本可能会迅速增加。
引擎的默认行为是将会话的使用限制为从对 JetBeginTransaction 的第一次调用开始到对 JetCommitTransaction 或 JetRollback 的匹配调用。 可以通过使用 JetSetSessionContext 和 JetResetSessionContext 设置自定义会话上下文来更改此行为以消除此限制。
数据库引擎还支持事务架构修改。 例如,可以开始新事务、创建表、添加几个列、创建一两个索引,然后中止事务。 刚添加的架构元素将从数据库中删除。 还可以在同一事务中混合使用架构修改和普通数据库更新。
要求
要求 | 值 |
---|---|
客户端 |
需要 Windows Vista、Windows XP 或 Windows 2000 Professional。 |
服务器 |
需要 Windows Server 2008、Windows Server 2003 或 Windows 2000 Server。 |
标头 |
在 Esent.h 中声明。 |
Library |
使用 ESENT.lib。 |
DLL |
需要ESENT.dll。 |
另请参阅
JET_ERR
JET_GRBIT
JET_SESID
JetCommitTransaction
JetGetSystemParameter
JetResetSessionContext
JetRollback
JetSetSessionContext
JetStopService
系统参数