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