Sql server Updlock、Holdlock、Rowlock使用情况?SQL Server中的悲观锁定
我对SQL Server中的悲观锁定有一些疑问?这里是我的类和测试场景 实体类:Sql server Updlock、Holdlock、Rowlock使用情况?SQL Server中的悲观锁定,sql-server,hibernate,jpa,locking,pessimistic-locking,Sql Server,Hibernate,Jpa,Locking,Pessimistic Locking,我对SQL Server中的悲观锁定有一些疑问?这里是我的类和测试场景 实体类: @Data @Entity(name = "mapping") @Table( uniqueConstraints = @UniqueConstraint( name = "UQ_MappingEntity", columnNames = { Constants.DATA_TYPE
@Data
@Entity(name = "mapping")
@Table(
uniqueConstraints =
@UniqueConstraint(
name = "UQ_MappingEntity",
columnNames = {
Constants.DATA_TYPE_VALUE,
Constants.DATA_TYPE_NAMESPACE_INDEX,
Constants.TENANT_ID,
Constants.ASSET_TYPE_NAME
}
)
)
public class MappingEntity {
@Id
@GeneratedValue(generator = "uuid")
@GenericGenerator(name = "uuid", strategy = "uuid2")
private String id;
@Column(name = Constants.DATA_TYPE_VALUE)
private long dataTypeValue;
@Column(name = Constants.DATA_TYPE_NAMESPACE_INDEX)
private int dataTypeNamespaceIndex;
@Column(name = Constants.ASSET_TYPE_NAME)
private String assetTypeName;
@Column(name = Constants.TENANT_ID)
private String tenantId;
}
存储库类:
public interface MappingRepository extends JpaRepository<MappingEntity, String> {
@Lock(LockModeType.PESSIMISTIC_WRITE)
MappingEntity findMappingEntityWithLockByTenantIdAndAssetTypeName(
String tenantId, String assetTypeName);
}
当我启用hibernate日志时。我看到下面的选择查询
select
mappingent0_.id as id1_1_,
mappingent0_.asset_type_name as asset_ty2_1_,
mappingent0_.data_type_namespace_index as data_typ3_1_,
mappingent0_.data_type_value as data_typ4_1_,
mappingent0_.tenant_id as tenant_i5_1_
from
mapping mappingent0_ with (updlock,
holdlock,
rowlock)
where
mappingent0_.tenant_id=?
and mappingent0_.asset_type_name=?
我同时发送了两个删除请求,其租户id相同,但资产类型名称不同
事务处理-1:租户\u id=“testtenant”,资产类型\u name=“testname1”
事务处理-2:租户\u id=“testtenant”,资产类型\u name=“testname2”
事务-1运行选择查询并获取结果,当事务-2运行选择查询时,它将阻塞。事务-1删除并完成事务后,事务-2获取结果并删除
我有两个问题
很可能查询(通过扫描)的行数超过了需要的行数。请尝试对唯一约束列重新排序,例如首先指定的
tenant\u id
和asset\u type\u name
。@DanGuzman I已按您所说的对唯一约束列重新排序,但仍然存在相同的问题。事务-2在T-1提交之前被阻止。如果有人能帮我解决这个问题,我将不胜感激。很可能查询(通过扫描)的行数超过了需要的行数。请尝试对唯一约束列重新排序,例如首先指定的tenant\u id
和asset\u type\u name
。@DanGuzman I已按您所说的对唯一约束列重新排序,但仍然存在相同的问题。在T-1提交之前,事务-2被阻止。如果有人帮我解决这个问题,我将不胜感激。
select
mappingent0_.id as id1_1_,
mappingent0_.asset_type_name as asset_ty2_1_,
mappingent0_.data_type_namespace_index as data_typ3_1_,
mappingent0_.data_type_value as data_typ4_1_,
mappingent0_.tenant_id as tenant_i5_1_
from
mapping mappingent0_ with (updlock,
holdlock,
rowlock)
where
mappingent0_.tenant_id=?
and mappingent0_.asset_type_name=?