我有一个SQL Server 2005存储过程,它将一堆行从一个表移动到另一个表。我正在使用spring的StoredProcedure
类来调用该过程。这是代码:
public class MigracionPagoMasivoNormalATemporalStoredProcedure extends StoredProcedure {
...
public Long ejecutar(final Long idPagoMasivo) {
final Map<String, Object> inputs = new HashMap<String, Object>();
Map<String, Object> outs = new HashMap<String, Object>();
inputs.put(ID_UPLOAD_HEADER, idPagoMasivo);
inputs.put(ID_UPLOAD_HEADER_TEMPORAL, 0);
try {
outs = super.execute(inputs);
return Long.valueOf((Integer) outs.get(ID_UPLOAD_HEADER_TEMPORAL));
} catch (final Exception e) {
// TODO dcalderon: Controlar excepciones
e.printStackTrace();
}
return new Long(0);
}
}
此过程被成功调用,并且完全符合预期目的。问题是我必须在之后查询迁移的行。这次我使用hibernate。两种方法都很好地分离,但我假设存储过程以某种方式锁定表并阻止查询执行。
这是存储过程:
CREATE PROCEDURE dbo.SP_PM_MIGRARLOTENORMALATEMPORAL(@ID_UPLOAD_HEADER int, @ID_UPLOAD_HEADER_TEMPORAL int OUTPUT)
AS
BEGIN
BEGIN TRANSACTION
/* Se migra el pago masivo de la tabla normal a la tabla temporal*/
INSERT INTO UPLOAD_HEADER_TEMPORAL (id_upload_header, ...)
SELECT [id], ...
FROM UPLOAD_HEADER WHERE [id] = @ID_UPLOAD_HEADER
SET @ID_UPLOAD_HEADER_TEMPORAL = (SELECT SCOPE_IDENTITY())
/* Se migra el detalle del pago masivo de la tabla normal a la temporal */
INSERT INTO UPLOAD_RECORD_TEMPORAL (id_header, ...)
SELECT @ID_UPLOAD_HEADER_TEMPORAL, ... FROM UPLOAD_RECORD
WHERE id_header = @ID_UPLOAD_HEADER
/* Se hace update al estado del detalle en la tabla temporal */
UPDATE UPLOAD_RECORD_TEMPORAL SET status = 0 WHERE id_header = @ID_UPLOAD_HEADER_TEMPORAL
COMMIT TRANSACTION
END
我的问题是,如何执行查询,恢复表的锁定? (我已经对代码进行了重新编写,我知道它在查询中被锁定)。感谢。
答案 0 :(得分:0)
插入表格时会被锁定
你应该等待那段时间 如果你不打扰新数据,你可以选择任何脏读方法,如NOLOCK
或读取未提交的隔离级别 - 在任何方面都不建议使用此方法
建议 - 尝试使用Transaction和Atomic一样多以避免锁定