【问题标题】:How to unlock table after calling a Spring stored procedure调用Spring存储过程后如何解锁表
【发布时间】:2013-03-08 16:35:33
【问题描述】:

我有一个 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);
     }
}

这个过程被成功调用,并且完全按照它的意图进行。问题是我必须在之后查询迁移的行。这次我使用休眠。两种方法都可以很好地分开,但我认为存储过程会以某种方式锁定表并阻止执行查询。

这是存储过程:

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

我的问题是,我怎样才能执行查询,恢复表的锁? (我已经调试了代码,我知道它被锁定在查询中)。谢谢。

【问题讨论】:

    标签: sql spring hibernate sql-server-2005


    【解决方案1】:

    在插入时表格将被锁定

    您应该等待那个时间范围 如果您不关心新数据,则可以使用 NOLOCK 等任何脏读方法

    或读取未提交的隔离级别 - 在任何方面都不建议使用此方法

    建议 - 尽量使用 Transaction 和 Atomic 来避免锁定

    【讨论】:

      猜你喜欢
      • 2018-04-23
      • 1970-01-01
      • 1970-01-01
      • 2021-09-02
      • 1970-01-01
      • 2012-06-03
      • 1970-01-01
      • 1970-01-01
      • 2018-07-20
      相关资源
      最近更新 更多