Использование Updlock, Holdlock, Rowlock? Пессимисты c Блокировка на SQL Сервере - PullRequest
0 голосов
/ 29 апреля 2020

У меня есть вопрос по поводу Pessimisti c Блокировка на SQL Сервере? Вот мои классы и тестовый сценарий:

Класс сущности:

@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);
}

Блок служебного кода:

@Transactional
    public void deleteAspectType(String tenantId, String aspectTypeId) {

MappingEntity mappingEntity = mappingRepository.findMappingEntityWithLockByTenantIdAndAssetTypeName(tenantId, assetTypeName);

mappingRepository.delete(mappingEntity);

}

Когда я включаю журналы гибернации. Я вижу запрос на выборку ниже.

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=?

Я отправил два запроса на удаление одновременно с тем же tenant_id, но с другим активом_тип_имя;

Транзакция-1: tenant_id = "testtenant", актив_тип_имя = "testname1"

Transaction-2: tenant_id = "testtenant", asset_type_name = "testname2"

Transaction-1 запускает запрос выбора и получает результаты. Когда Transaction-2 запускает запрос select, он блокируется. После того, как Transaction-1 удалит и завершит транзакцию, Transaction-2 получит результаты и удалит.

У меня есть два вопроса;

  1. Что такое (updlock, holdlock, rowlock ) использовать для? Когда я использую эти три параметра одновременно, как влияют на мой запрос и транзакцию?

  2. Почему Transaction-2 блокировала выполнение запроса? Обе транзакции выбраны разными строками.

...