了解并发控制

下载 JDBC 驱动程序

并发控制指的是当多个用户同时更新行时,用于保护数据库完整性的各种技术。 并发机制不正确可能导致脏读、虚拟读取和不可重复读等问题。 Microsoft JDBC Driver for SQL Server 向 SQL Server 使用的所有并发技术提供了接口以解决这些问题。

注意

有关 SQL Server 并发的详细信息,请参阅“管理并发数据访问”

注解

JDBC 驱动程序支持以下并发类型:

并发类型 特征 行锁 说明
CONCUR_READ_ONLY 只读 不允许通过游标进行更新,并且针对组成结果集的行不持有锁。
CONCUR_UPDATABLE 乐观读写 数据库假定未必会发生行争用现象,但存在这种可能性。 使用时间戳比较来检查行完整性。
CONCUR_SS_SCROLL_LOCKS 悲观读写 数据库假定可能会发生行争用现象。 通过行锁定来确保行完整性。
CONCUR_SS_OPTIMISTIC_CC 乐观读写 数据库假定未必会发生行争用现象,但存在这种可能性。 使用时间戳比较来验证行的完整性。

对于 SQL Server 2005 (9.x) 和更高版本,如果表中不包含时间戳列,则服务器会将这一项改为 CONCUR_SS_OPTIMISTIC_CCVAL。

对于 SQL Server 2000 (8.x),如果基础表具有时间戳列,则将使用 OPTIMISTIC WITH ROW VERSIONING,即使指定了 OPTIMISTIC WITH VALUES 也不例外。 如果指定了 OPTIMISTIC WITH ROW VERSIONING 并且表不具有时间戳,则使用 OPTIMISTIC WITH VALUES。
CONCUR_SS_OPTIMISTIC_CCVAL 乐观读写 数据库假定未必会发生行争用现象,但存在这种可能性。 使用行数据比较来检查行完整性。

不可更新的结果集

可更新的结果集是指可以在其中插入、更新和删除行的结果集。 在下列情况下,SQL Server 无法创建可更新的游标。 生成的异常为“结果集不可更新”。

原因 说明 纠正方法
语句不是使用 JDBC 2.0(或更高版本)语法创建的 JDBC 2.0 引入了新的方法来创建语句。 如果使用 JDBC 1.0 语法,则结果集默认为只读。 创建语句时,指定结果集类型和并发机制。
语句是使用 TYPE_SCROLL_INSENSITIVE 创建的 SQL Server 创建一个静态快照游标。 这将从基础表行中断开连接,以帮助保护游标,从而防止其他用户进行更新。 将 TYPE_SCROLL_SENSITIVE、TYPE_SS_SCROLL_KEYSET、TYPE_SS_SCROLL_DYNAMIC 或 TYPE_FORWARD_ONLY 用于 CONCUR_UPDATABLE 以避免创建静态游标。
表设计排除了 KEYSET 或 DYNAMIC 游标。 基础表没有唯一键以启用 SQL Server 来唯一地标识一行。 向表中添加唯一键,以便为每行提供唯一的标识。

另请参阅

通过 JDBC 驱动程序管理结果集