即使所有软件都没有错误且所有硬件都完全可靠,计算机外部的世界也可干扰它。闪电可 能击中建筑物,中断供电并在您的 UPDATE 语句运行期间停止计算机。当磁盘已满或用户提供不正确的数据时,更可能发生的情景是,导致您的多行插入过早停止并产生错误。 在任何情况下,每当您修改数据,您必须假设某种不可预测的事件可中断该修改。
当外部原因导致修改中断时,您不可确定该操作完成了多少。即使在单行操作中,您也不 可知道是否正确地更新了到达了磁盘的数据或索引。
如果多行修改是一个问题,则多语句修改就更糟。通常在程序中嵌入它们,因此您看不到 正在执行的个别 SQL 语句。
例如,要在演示数据库中输入新的订单,请执行下列步骤:
1. 在 orders 表中插入一行。(此插入生成一个订单编号。)
2. 对于订购的每一商品,在 items 表中插入一行。
存在两种编制订单输入应用程序的方法。一种方法是使它完全是交互的,以便程序立即插 入第一行,然后在用户输入时插入每一商品。但这种方法使得操作可能遭遇许多更不可预 测的事件:客户的电话电线,用户按错键,用户的终端或计算机断电,等等。
下列列表描述构建订单输入应用程序的正确方法:
• 以交互方式接受所有数据。
• 验证数据并展开它(例如,在 stock 和 manufact 中查找代码)。
• 在屏幕上显示信息以进行检查。
• 等待操作人员进行最终的提交。
• 快速地执行插入。
即使使用这些步骤,不可预测的情况还可在它插入该订单之后,但在它完成插入商品之前 停止该程序。如果发生那种情况,则数据库处于不可预测的状态:它的数据完整性受到损 害。
事务
对所有这些潜在问题的解决方案称为事务。事务是必须或者全部完成,或者根本就不执行 的修改的序列。数据库服务器保证在事务的范围内执行的操作或者完整并正确地提交到磁 盘,或者将数据库恢复到事务开始之前的同一状态。
事务不仅是对不可预测的故障的保护;当程序检测到逻辑错误时,它还为程序提供一种规 避的方法。
事务日志记录
数据库服务器可保持对在事务期间数据库服务器对数据库进行的每一更改的记录。如果发 生了取消该事务的情况,则数据库服务器自动地使用这些记录来撤销更改。许多原因可导 致事务失败。例如,发出 SQL 语句的程序可失败或被终止。数据库服务器一发现事务失败,失败可能就在重新启动计算机和数据库服务器之后发生,它就使用来自该事务的记录 来将数据库返回到之前的同一状态。
保存事务的记录的过程称为事务日志记录,或简称为日志记录。事务的记录,称为日志记 录,保存在与数据库分开的磁盘空间部分中。此空间称为逻辑日志,因为该日志记录表示 事务的逻辑单元。 GBase 8s 提供下列支持:
• 在日志记录数据库中创建无日志记录(raw)或日志记录(standard)的表。
• 使用 ALTER TABLE 语句将表从无日志记录改变为日志记录,或相反。
为了快速加载非常大的表,GBase 8s 支持无日志记录的表。建议您在事务内不使用无日志 记录的表。要避免并发问题,在您在事务中使用表之前,请使用 ALTER TABLE 语句来使 该表成为 standard(即,日志记录)。
要获取关于 GBase 8s 的无日志记录的表的更多信息,请参阅《GBase 8s 管理员指南》。 要了解无日志记录的表的性能优势,请参阅《GBase 8s 性能指南》。要获取关于 ALTER TABLE 语句的信息,请参阅 GBase 8s SQL 指南:语法。
大多数 GBase 8s 数据库不会自动地生成事务记录。DBA 决定数据库是否使用事务日志记 录。没有事务日志记录,您就不可回滚事务。
日志记录和级联删除
为了使级联删除起作用,必须在您的数据库中打开日志记录,因为当您指定级联删除时, 首先在父表的主键上执行删除。如果在执行父表的主键的行删除之后,但在删除子表的外 键的行之前,系统出现故障,则违反引用完整性。如果关闭日志记录,即使是临时地关闭, 也不会级联删除。然而,在重新打开日志记录之后,又可级联删除。 GBase 8s 允许您使用 CREATE DATABASE 语句中的 WITH LOG 子句来打开日志记录。




