并发控制

并发 性是两个事务能够同时使用同一数据,并且随着事务隔离的增加,并发性通常会降低。 这是因为事务隔离通常是通过锁定行实现的,由于锁定了更多的行,因此可以完成更少的事务,而不会被锁定的行暂时阻止。 虽然通常认为并发性降低是为维护数据库完整性而在更高事务隔离级别上进行的权衡,但这可能在使用游标的高读/写活动的交互式应用程序中成为一个问题。

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

如果隔离级别为可重复读取,则事务可能会根据实现方式锁定 SQLFetchScroll 返回的每一行。 如果隔离级别是可序列化的,则事务可能会锁定整个 Orders 表。 在任一情况下,事务仅在提交或回滚时释放锁。 因此,如果用户花费大量时间读取订单,并且很少更新、删除或插入订单,则事务可以轻松锁定大量行,使其对其他用户不可用。

即便游标是只读的,并且应用程序只允许用户读取现有的订单,这仍然是一个问题。 在这种情况下,应用程序在调用 SQLCloseCursor (在自动提交模式)或 SQLEndTran (在手动提交模式下)时提交事务并释放锁。

本节包含以下主题。