У меня есть вопрос по поводу 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 получит результаты и удалит.
У меня есть два вопроса;
Что такое (updlock, holdlock, rowlock ) использовать для? Когда я использую эти три параметра одновременно, как влияют на мой запрос и транзакцию?
Почему Transaction-2 блокировала выполнение запроса? Обе транзакции выбраны разными строками.