并发控制

并发性是两个事务同时使用相同数据的能力,随着事务隔离的增加,并发性通常会降低。 这是因为事务隔离通常是通过锁定行来实现的,并且随着锁定的行越多,可以完成的事务越少,而不会至少被锁定的行暂时阻止。 虽然降低并发性通常被视为达到维护数据库完整性所需的较高事务隔离级别而做出的权衡,但在使用游标的高读/写活动的交互式应用程序中,这可能会成为问题。

例如,假设应用程序执行 SQL 语句 SELECT * FROM Orders。 该应用程序调用 SQLFetchScroll 来滚动结果集,并允许用户更新、删除或插入订单。 用户更新、删除或插入订单后,应用程序将提交事务。

如果隔离级别为“可重复读取”,则该事务可能会锁定 SQLFetchScroll 返回的每一行,具体取决于其实现方式。 如果隔离级别为“可序列化”,则该事务可能会锁定整个订单表。 在任一情况下,事务仅在提交或回滚时释放其锁定。 因此,如果用户花费大量时间读取订单,而更新、删除或插入订单的时间很少,则事务很容易会锁定大量行,从而使其他用户无法使用这些行。

即使游标为只读属性,并且应用程序允许用户仅读取现有订单,这也会是一个问题。 在这种情况下,应用程序在自动提交模式下调用 SQLCloseCursor 或在手动提交模式下调用 SQLEndTran 时,会提交事务并释放锁定。

本部分包含以下主题。