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

注意: 有关 SQL Server 并发的详细信息,请参阅 SQL Server 联机丛书中的“管理并发数据访问”。

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

并发类型 特征 行锁 说明

CONCUR_READ_ONLY

只读

不允许通过游标进行更新,并且针对组成结果集的行不持有锁。

CONCUR_UPDATABLE

乐观读写

数据库假定未必会发生行争用现象,但存在这种可能性。使用时间戳比较来检查行完整性。

CONCUR_SS_SCROLL_LOCKS

悲观读写

数据库假定可能会发生行争用现象。通过行锁定来确保行完整性。

CONCUR_SS_OPTIMISTIC_CC

乐观读写

数据库假定未必会发生行争用现象,但存在这种可能性。使用时间戳比较来验证行的完整性。

对于 SQL Server 2005 和更高版本,如果表中不包含 timestamp 列,则服务器会将这一项改为 CONCUR_SS_OPTIMISTIC_CCVAL。

对于 SQL Server 2000,如果基础表具有时间戳列,则将使用 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 驱动程序管理结果集