0

我试图在 8 个表中插入近 1,75,00,000 个。我已经为此存储了过程。在该过程的开始和结束时,我已经编写了 Transaction。

错误:由于“ACTIVE_TRANSACTION”,数据库“Database”的事务日志已满。

注意:我想保留事务中的所有内容,它的自动化过程。这个过程将每月在数据库上运行

CREATE OR ALTER PROCEDURE [dbo].[InsertInMainTbls]
AS
BEGIN
PRINT('STARTED [InsertInMainTbls]')

DECLARE @NoRows INT
DECLARE @maxLoop INT
DECLARE @isSuccess BIT=1
BEGIN TRY

    BEGIN TRAN
        --1st table
        SET @NoRows = 1
        SELECT @maxLoop=(MAX([col1])/1000)+1 FROM ProcessTbl
        SELECT 'loop=='+ CAST(@maxLoop as Varchar)
        WHILE (@NoRows <= @maxLoop)
        BEGIN
                INSERT INTO MainTbl WITH(TABLOCK)
                ( col1,col2,col3....col40)
                SELECT
                ( val1,val2,val3....val40)FROM
                ProcessTbl
                WHERE [col1] BETWEEN (@NoRows*1000)-1000 
                AND (@NoRows*1000)-1
            SET @NoRows = @NoRows+1;
        END 
    --2nd table
    .
    .
    .
    --8th table
    SET @isSuccess=1;  
    COMMIT TRAN

END TRY
BEGIN CATCH

        PRINT ERROR_MESSAGE();
        SELECT  ERROR_MESSAGE() 'ErrorMsg'  ;
        SET @isSuccess=0;
    ROLLBACK TRAN

END CATCH
4

1 回答 1

0

尽管拥有如此庞大的事务是无稽之谈,尽管您可以通过使用时间戳或 GUID 之类的标记行来手动回滚,但要这样做,您需要在事务日志文件中有必要的空间存储从第一个到最后一个插入的所有行,以及其他用户将同时执行的所有事务。许多解决方案可以解决您的问题:1)扩大您的事务日志文件 2)添加一些补充日志文件 3)删除或缩小事务范围

于 2020-03-27T14:52:50.037 回答