Warning: file_get_contents(/data/phpspider/zhask/data//catemap/1/hibernate/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server Updlock、Holdlock、Rowlock使用情况?SQL Server中的悲观锁定_Sql Server_Hibernate_Jpa_Locking_Pessimistic Locking - Fatal编程技术网

Sql server Updlock、Holdlock、Rowlock使用情况?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

我对SQL Server中的悲观锁定有一些疑问?这里是我的类和测试场景

实体类:

@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获取结果并删除

我有两个问题

  • (updlock、holdlock、rowlock)的用途是什么?当我同时使用这三个选项时,如何影响我的查询和事务

  • 为什么Transaction-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=?