iLog 接口 (txlogpub.h)
提供通用的低级别日志记录功能。
通用日志文件系统 (CLFS) 提供的功能是 ILog 提供的超集。
继承
ILog 接口继承自 IUnknown 接口。 ILog 还具有以下类型的成员:
方法
ILog 接口具有这些方法。
ILog::AppendRecord 将新记录写入日志末尾。 |
ILog::Force 强制日志内容到磁盘,至少通过指定的 LSN。 |
ILog::GetLogLimits 检索有关日志当前边界的信息。 |
ILog::ReadRecord 从日志中读取记录。 |
ILog::ReadRecordPrefix 从日志中读取记录的初始部分。 |
ILog::SetAccessPolicyHint 提供有关将读取记录的模式的实现的提示。 |
ILog::TruncatePrefix 丢弃日志的指定前缀,使其不再可检索。 |
注解
WAL 是某些应用程序(如数据库管理系统)用于实现原子事务和独立事务的技术。 此方法涉及在进行这些更改之前,将应用程序资源更改的记录写入日志。 这样,可以根据需要还原更改,例如,如果事务失败或中断。 为了使应用程序能够针对系统崩溃或电源故障等中断提供可靠的事务,日志记录实现必须提供强制使用日志的方法;也就是说,确保之前写入的记录在磁盘上,然后再继续。
写入使用 ILog 的记录是一项顺序操作;也就是说,新记录始终追加到日志的末尾。 追加到日志的每个记录都会分配一个日志序列号 (LSN) ,该数字标识符稍后可用于检索记录。 数据类型 LSN 是 LARGE_INTEGER的 typedef,一个有符号的 64 位值;但是, ILog 仅使用具有非否定值的 LSN。 此外,LSN 必须满足以下条件:
- LSN 单调递增:如果记录 B 在记录 A 之后写入日志,则记录 B 的 LSN 必须大于记录 A 的 LSN。
- 零值和 MAXLSN (0x7FFFFFFFFFFFFFFF) 的值不得用作记录的 LSN,因为它们对 ILog 的某些方法具有特殊意义。
将记录追加到日志后,可能不会对其进行修改。 但是,如果不再需要以前写入的记录(例如已提交的事务中更改的记录), ILog 支持截断日志。 这样,就可重复使用用于无谓记录的磁盘空间。 截断日志包括删除 LSN 小于指定值的所有记录。
作为性能优化, ILog 的某些实现可能会缓冲内存中的记录,直到强制使用日志。 如果是这种情况,则特别必须考虑错误控制和恢复。 请考虑以下情况:
- 记录 A 追加到日志中,但日志不是强制的。 ILog 实现将记录复制到内存中的缓冲区,并返回成功代码。
- 记录 B 追加到日志中, ILog 实现决定强制日志到磁盘。 这是因为调用方要求强制使用日志,或者因为内存缓冲区已满。 但是,写入操作失败,例如,由于磁盘空间不足。
基于 ILog 文件的实现
Windows 操作系统提供 基于文件的 ILog 实现,使你能够创建适合对文件进行预写日志记录的日志。 日志使用文件作为循环缓冲区,这样就可以重复使用未使用的空间。 这也可能会增加文件的大小,在日志已满时可能需要容纳其他记录。 对日志的更改以原子方式进行,以便在崩溃后可以恢复日志的内容。 此实现使用内存中的缓冲区来追加日志记录。 因此,当 ILog::AppendRecord 方法返回时,不保证将记录写入磁盘,除非调用方请求强制使用日志。使用以下 CLSID 创建基于文件的日志实例 (请参阅 CoCreateInstance) :
CLSID_SimpleFileBasedLog ({E16C0593-128F-11D1-97E4-00C04FB9618A} ) 。
基于文件的 ILog 实现还支持 IFileBasedLogInit 和 IPersistFile 接口。 使用 IFileBasedLogInit::InitNew 创建新的日志文件。 使用 IPersistFile::Load 打开现有日志文件。
此实现使用简单的错误控制策略。 如果任一方法因文件系统级别的错误(包括磁盘已满错误)而失败,日志将固定为错误状态。 这可以防止客户端将其他记录追加到文件或读取可能错误的记录。 若要继续使用日志文件,必须创建日志的新实例。
要求
要求 | 值 |
---|---|
最低受支持的客户端 | Windows XP [仅限桌面应用] |
最低受支持的服务器 | Windows Server 2003 [仅限桌面应用] |
目标平台 | Windows |
标头 | txlogpub.h |