了解并发控制
并发控制指的是当多个用户同时更新行时,用于保护数据库完整性的各种技术。 并发机制不正确可能导致脏读、虚拟读取和不可重复读等问题。 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 来唯一地标识一行。 | 向表中添加唯一键,以便为每行提供唯一的标识。 |