1

一連の行をあるテーブルから別のテーブルに移動する SQL Server 2005 ストアド プロシージャがあります。私は春の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

私の質問は、クエリを実行してテーブルのロックを回復するにはどうすればよいですか? (私はすでにコードをデバッグしており、クエリでロックされることを知っています)。ありがとう。

4

1 に答える 1

0

挿入中、テーブルはロックされます

新しいデータを気にしない場合は、その時間枠を待つ必要があります。 NOLOCK のようなダーティな読み取りメソッドを使用できます

またはコミットされていない分離レベルを読み取る - この方法はどの面でも推奨されていません

提案 - ロックを避けるために、Atomic と同じくらい Transaction を使用してみてください

于 2013-07-18T04:35:33.357 に答える