2012-01-25 22 views
7

Tôi nhận ngoại lệ này về các cam kết và hồi tố nhưng không chắc chính xác những gì là sai với Thủ tục lưu trữ của tôi. Tôi đã đọc câu trả lời trong các câu hỏi khác và không thể tìm thấy chính xác số lượng cam kết đang nhận được điều sai lầm.Số giao dịch sau EXECUTE cho biết số câu lệnh BEGIN và COMMIT không khớp. Số đếm trước

Vì vậy, đây là Stored Procedure tôi sử dụng:

-- this is a procedure used for the purge utility. This procedure uses the parameters of a date and lets user select 
-- if the leads that should be purge must be closed either before, on or since that date. 
-- operator: 0-->less 1-->equal 2-->greater 
-- @closed: closing date 
-- leadscount: returns the count of leads deleted 

IF OBJECT_ID ('LEAD_PURGE', 'P') IS NOT NULL 
    DROP PROCEDURE LEAD_PURGE 
go 

CREATE PROCEDURE LEAD_PURGE 
@purgextns INT, 
@leadscount INT OUTPUT 
AS 
BEGIN 
BEGIN TRANSACTION 
CREATE TABLE #ASSIGNMENTS_DELETED 
(
    ID NUMERIC(19, 0) 
    PRIMARY KEY (ID) 
) 

CREATE TABLE #MAPRESULTS_DELETED 
(
    ID NUMERIC(19, 0) 
    PRIMARY KEY (ID) 
) 

CREATE TABLE #COMMAND_DELETED 
(
    ID NUMERIC(19, 0) 
    PRIMARY KEY (ID) 
) 

CREATE TABLE #PROGRESS_STATUS_DELETED 
(
    ID NUMERIC(19, 0) 
    PRIMARY KEY (ID) 
) 

CREATE TABLE #DETAILS_DELETED 
(
    ID NUMERIC(19, 0) 
    PRIMARY KEY (ID) 
) 

CREATE TABLE #NEEDS_DELETED 
(
    ID NUMERIC(19, 0) 
    PRIMARY KEY (ID) 
) 

insert into #ASSIGNMENTS_DELETED 
select SEQID FROM ASSIGNMENT WHERE LEADSEQ IN (SELECT ID FROM PURGE_LEAD); 

SELECT @leadscount = (SELECT COUNT(*) FROM PURGE_LEAD); 

INSERT INTO #MAPRESULTS_DELETED 
SELECT ID FROM MAPRESULT WHERE ASSIGNMENTSEQ IN (SELECT ID FROM #ASSIGNMENTS_DELETED) 

INSERT INTO #COMMAND_DELETED 
SELECT ID FROM EXECUTERULECOMMAND WHERE MAPRESULTID IN (SELECT ID FROM #MAPRESULTS_DELETED) 

INSERT INTO #PROGRESS_STATUS_DELETED 
SELECT PROGRESS_STATUS_ID FROM COMMAND WHERE ID IN (SELECT ID FROM #COMMAND_DELETED) 

INSERT INTO #DETAILS_DELETED 
SELECT DETAILID FROM LEAD WHERE SEQID IN (SELECT ID FROM PURGE_LEAD) 

INSERT INTO #NEEDS_DELETED 
SELECT NEEDSID FROM LEAD WHERE SEQID IN (SELECT ID FROM PURGE_LEAD) 



DELETE FROM PROGRESS_STATUS WHERE ID IN (SELECT ID FROM #PROGRESS_STATUS_DELETED) 

DELETE FROM EXECUTERULECOMMAND WHERE ID IN (SELECT ID FROM #COMMAND_DELETED) 

DELETE FROM COMMAND WHERE ID IN (SELECT ID FROM #COMMAND_DELETED) 

DELETE FROM SIMPLECONDITIONAL WHERE RESULT IN (SELECT ID FROM #MAPRESULTS_DELETED) 

DELETE FROM MAPPREDICATE WHERE ROWBP IN (SELECT ID FROM MAPROW WHERE RESULT IN (SELECT ID FROM #MAPRESULTS_DELETED)) 

DELETE FROM MAPROW WHERE RESULT IN (SELECT ID FROM #MAPRESULTS_DELETED) 

DELETE FROM MAPRESULT WHERE ID IN (SELECT ID FROM #MAPRESULTS_DELETED) 

DELETE FROM ASSIGNMENTATTACHMENTS WHERE ASSIGNMENTSEQ IN (SELECT ID FROM #ASSIGNMENTS_DELETED) 

DELETE FROM LEADOBSERVER WHERE ASSIGNSEQ IN (SELECT ID FROM #ASSIGNMENTS_DELETED) 

DELETE FROM MAPDESTINATIONS WHERE SUGGESTEDASSIGNID IN 
    (SELECT ID FROM SUGGESTEDASSIGNMENT WHERE ASSIGNMENT_SEQID IN (SELECT ID FROM #ASSIGNMENTS_DELETED)) 

DELETE FROM SUGGESTEDASSIGNMENT WHERE ASSIGNMENT_SEQID IN (SELECT ID FROM #ASSIGNMENTS_DELETED) 

DELETE FROM PRODUCTINTEREST WHERE LEADSEQ IN (SELECT ID FROM PURGE_LEAD) 



CREATE TABLE #SALE_DELETED_EX 
(
    ID NUMERIC(19, 0) 
    PRIMARY KEY (ID) 
) 
INSERT into #SALE_DELETED_EX SELECT SALEEXSEQ FROM SALE WHERE SEQID IN (SELECT SALEID FROM LEADSALES WHERE LEADID IN (SELECT ID FROM PURGE_LEAD)) 


DELETE FROM SALE WHERE SEQID IN (SELECT SALEID FROM LEADSALES WHERE LEADID IN (SELECT ID FROM PURGE_LEAD)) 


DELETE FROM SALEEXTENSIONS WHERE 
    SEQID IN (SELECT ID FROM #SALE_DELETED_EX) 

DELETE FROM LEADSALES WHERE LEADID IN (SELECT ID FROM PURGE_LEAD) 


DELETE FROM NOTES WHERE OBJECTID IN (SELECT ID FROM #NEEDS_DELETED) OR OBJECTID IN (SELECT ID FROM #DETAILS_DELETED) 

DELETE FROM HISTORYRECORD WHERE OBJECTID IN (SELECT ID FROM #DETAILS_DELETED) 

DELETE FROM DETAIL WHERE SEQID IN (SELECT ID FROM #NEEDS_DELETED UNION SELECT ID FROM #DETAILS_DELETED) 

DELETE FROM MESSAGES WHERE PROVIDERID IN (SELECT ID FROM PURGE_LEAD) 

DELETE FROM ASSIGNMENT WHERE LEADSEQ IN (SELECT ID FROM PURGE_LEAD) 

DELETE FROM LEAD WHERE SEQID IN (SELECT ID FROM PURGE_LEAD) 

CREATE TABLE #PURGE_LEAD_E 
(
    ID NUMERIC(19, 0) 
    PRIMARY KEY (ID) 
) 

INSERT into #PURGE_LEAD_E Select SEQID FROM LEADEXTENSIONS WHERE 
    SEQID NOT IN (SELECT LEADEXSEQ FROM LEAD) 

if @purgextns = 1 begin 
    DELETE FROM LEADEXTENSIONS WHERE 
     SEQID IN (SELECT ID FROM PURGE_LEAD_E) 
end 


DELETE FROM PURGE_LEAD; 

DROP TABLE #ASSIGNMENTS_DELETED 

DROP TABLE #MAPRESULTS_DELETED 

DROP TABLE #COMMAND_DELETED 

DROP TABLE #PROGRESS_STATUS_DELETED 

DROP TABLE #DETAILS_DELETED 

DROP TABLE #NEEDS_DELETED 

DROP TABLE #PURGE_LEAD_E 

DROP TABLE #SALE_DELETED_EX 

COMMIT 
END 
go 

bây giờ tôi gọi thủ tục này trong đoạn mã sau:

try { 
     c = new ConnectionHelper().getConnection(); 
     String sql = ""; 
     if (shouldPurgeExtns) { 
      progressModel.makeProgress("progress.deleting.dependents"); 
      purgeMultiselect(c, LEAD, isMSSQL); 
     } 
     sql = "{CALL " + TOPLinkManager.getSchemaPrefix() 
       + "LEAD_PURGE (?,?)}"; 
     cs = c.prepareCall(sql); 
     cs.setInt(1, shouldPurgeExtns ? 0 : 1); 
     cs.registerOutParameter(2, java.sql.Types.INTEGER); 
     cs.executeUpdate(); 
     int rowcount = cs.getInt(2); 
     cs.close(); 
     progressModel.makeProgress("progress.recording.history"); 
     recordHistory(c, isMSSQL, LEAD, DateTypeDecorator.CLOSED, date, 
       rowcount); 
     done(progressModel); 
     c.close(); 
     return true; 
    } catch (Exception e) { 
     Logs.main.error("Error Purging Leads", e); 
     throw new Exception(e.getMessage()); 
    } 

Và tôi nhận được một ngoại lệ trên dòng mà nói int rowcount = cs.getInt(2);

Ngoại lệ là:

com.microsoft.sqlserver.jdbc.SQLServerException: Transaction count after EXECUTE indicates a mismatching number of BEGIN and COMMIT statements. Previous count = 0, current count = 1. 
    at com.microsoft.sqlserver.jdbc.SQLServerException.makeFromDatabaseError(SQLServerException.java:196) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.getNextResult(SQLServerStatement.java:1454) 
    at com.microsoft.sqlserver.jdbc.SQLServerStatement.processResults(SQLServerStatement.java:1083) 
    at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.getOutParameter(SQLServerCallableStatement.java:112) 
    at com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.getterGetParam(SQLServerCallableStatement.java:387) 

Hãy giúp tôi. tại com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.getValue (SQLServerCallableStatement.java:393) tại com.microsoft.sqlserver.jdbc.SQLServerCallableStatement.getInt (SQLServerCallableStatement.java:437) tại marketsoft.tools.purge.PurgeUtils. PurgeLeads (PurgeUtils.java:283)

EDIT:

như tôi đã trả lời câu hỏi này bản thân mình ... tôi muốn thay đổi câu hỏi một chút bây giờ.

Tại sao không có ngoại lệ nào được ném vào phương thức thực thi ???

Trả lời

2

Xin lỗi các bạn! Cảm ơn tất cả những nỗ lực của bạn, Cuối cùng, đó là một sai lầm rất nhỏ trên một phần của tôi trong Stored Procedure:

Nhìn vào dòng:

if @purgextns = 1 begin 
    DELETE FROM LEADEXTENSIONS WHERE 
     SEQID IN (SELECT ID FROM PURGE_LEAD_E) 
end 

Nó phải là #PURGE_LEAD_E

Tất cả các câu trả lời của bạn đã giúp tôi có cái nhìn khác về phát triển quy trình lưu trữ. Cảm ơn rất nhiều!

+0

Tôi vẫn đang tìm câu trả lời cho lý do tại sao chính xác lỗi không được ném vào phương thức thực thi? – MozenRath

+0

bạn nên thay đổi để sử dụng xử lý lỗi anyway – gbn

+0

yeah! Đó là những gì tôi có nghĩa là theo quan điểm :) – MozenRath

7

Cố gắng thêm vào đầu của thủ tục

SET XACT_ABORT ON 

Hoặc

quấn báo cáo của bạn với

begin try 
    BEGIN TRANSACTION 
Your TSQL code 

    COMMIT 
end try 
begin catch 
    ROLLBACK 
    RAISERROR('Gotcha!', 16, 1) 
end catch 

Để kiểm tra có bao nhiêu bị giam BEGIN TRAN được mở ra kiểm tra hệ thống @@TRANCOUNT biến số

14

COMMIT của bạn không bị tấn công, có thể do lỗi. Các giao dịch sẽ không được cuộn lại tự động

Cách tốt nhất (và thực hành tốt nhất) được thêm một số xử lý

CREATE PROCEDURE LEAD_PURGE 
    @purgextns INT, 
    @leadscount INT OUTPUT 
AS 
SET NOCOUNT, XACT_ABORT ON; 

BEGIN TRY 
    BEGIN TRANSACTION 

    CREATE TABLE #ASSIGNMENTS_DELETED 
    (
     ID NUMERIC(19, 0) 
     PRIMARY KEY (ID) 
) 

    ... 
    DROP TABLE #SALE_DELETED_EX 

    COMMIT TRANSACTION 
END TRY 
BEGIN CATCH 
    IF XACT_STATE() <> 0 
     ROLLBACK TRANSACTION 
    RAISERROR ('it broke', 16, 1) 
END CATCH 
go 

Để biết thêm chi tiết lỗi SQL về những gì đang xảy ra ở đây, xem câu trả lời của tôi ở đây Nested stored procedures containing TRY CATCH ROLLBACK pattern?

lưu ý: bạn không cần phải thả các bảng tạm thời khi họ đi ra khỏi phạm vi khi thủ tục lưu trữ thoát

+0

nếu có lỗi trong khi thực hiện quy trình, tại sao nó không bị ném vào phương thức thực thi? Hơn nữa, tôi chỉ sử dụng một thủ tục lưu trữ duy nhất. – MozenRath

+0

@MozenRath: Tôi không biết, nhưng proc không chạy để hoàn thành ... – gbn

1

làm thế nào chính xác biến @leadscount chứa đếm dẫn xóa?

Đây là nơi duy nhất tôi nhìn thấy nó beeing sử dụng:

CHỌN @leadscount = (SELECT COUNT (*) FROM PURGE_LEAD);

Dù sao, để kiểm tra, tại sao bạn không chạy mã trên bên ngoài ngữ cảnh giao dịch?

Nếu bạn thực sự cần nó bên trong một giao dịch, hãy thử tải giá trị vào một biến bảng (tạo một bảng chỉ với một cột). Vì họ không tham gia vào các giao dịch, bạn có thể kiểm tra xem giao dịch có phải là vấn đề thực sự của bạn hay không.

+0

bảng purge_lead chứa các id dẫn để xóa vì vậy đó là số lượng các dẫn bị xóa – MozenRath

+0

ok, nhưng nó không cần nằm trong phạm vi giao dịch. – Diego

+0

có nó! Tôi đang thay đổi nội dung của bảng quá sau – MozenRath

3

Điều này thường xảy ra khi giao dịch được bắt đầu và giao dịch không được cam kết hoặc không hoàn tiền.

Trong trường hợp lỗi xảy ra trong thủ tục lưu trữ của bạn, điều này có thể khóa bảng cơ sở dữ liệu vì giao dịch không hoàn thành do một số lỗi thời gian chạy trong trường hợp không xử lý ngoại lệ Bạn có thể sử dụng Xử lý ngoại lệ như dưới đây. SET XACT_ABORT

SET XACT_ABORT ON 
SET NoCount ON 
Begin Try 
    BEGIN TRANSACTION 
     //Insert ,update queries  
    COMMIT 
End Try 
Begin Catch 
    ROLLBACK 
End Catch 
Các vấn đề liên quan