Ошибка взаимоблокировки в MSSQL 2012
Я стою лицом к лицу
"Transaction (Process ID 426) was deadlocked on lock resources with another process and has been chosen as the deadlock victim. Rerun the transaction."также некоторое время получаю эту ошибку
"Violation of UNIQUE KEY constraint 'UK_UserTotalEntry_VoucherNo'. Cannot insert duplicate key in object 'dbo.UserTotalEntry'. The duplicate key value is (89295/37029)"эта ошибка какое-то время приходит и не приходит. Кроме того, я не могу генерировать эту ошибку снова, я пробовал много раз. Я пытаюсь вставить данные оптом с помощью datatable и создал типизированную таблицу в БД. Я делюсь своими кодами ниже и прошу о помощи, а также использую общий хостинг-план Go daddy, в котором я ничего не могу изменить в своей БД. Заранее спасибо.
Что я уже пробовал:
vb.net код
Public Function SaveUpdate(ByVal Action As String) Dim Msg As String = Nothing Try Dim dt_bulk As New DataTable dt_bulk.Columns.Add("VoucherNo") dt_bulk.Columns("VoucherNo").Expression = "'" & lbl_vno.Text & "'" dt_bulk.AcceptChanges() Dim dt_Update As New DataTable dt_Update = dgv_manualentryedit.DataSource dt_bulk.Merge(dt_Update) If cn.State = ConnectionState.Closed Then cn.Open() Dim ds As New DataSet() cmd = New SqlCommand("Proc_dml_SaveUpdate") cmd.Parameters.AddWithValue("@NumberEntry", dt_bulk) cmd.Parameters.AddWithValue("@VoucherNo", lbl_vno.Text) cmd.Parameters.AddWithValue("@date", CustomDate(dtp_Date.Value)) cmd.Parameters.AddWithValue("@GameMasterId", GameMasterID) cmd.Parameters.AddWithValue("@ProfitID", ProfitIDNo) cmd.Parameters.AddWithValue("@TotalAmt", lbl_mamount.Text) cmd.Parameters.AddWithValue("@CreatedBy", LoginID) cmd.Parameters.AddWithValue("@Action", Action) cmd.Parameters.AddWithValue("@DeviceID", "2") cmd.Connection = cn cmd.CommandType = CommandType.StoredProcedure cmd.CommandTimeout = 9000 adapter = New SqlDataAdapter(cmd) adapter.Fill(ds) If DsJantri.Tables.Count = 1 Then ds.Tables(0).TableName = "Status" Else ds.Tables(0).TableName = "PartyDetail" ds.Tables(1).TableName = "Status" End If Catch ex As Exception ShowErrorMsg(ex, Me.Name, MethodInfo.GetCurrentMethod().Name) Return False End Try Return True End Function
--моя хранимая процедура
ALTER PROCEDURE [dbo].[Proc_dml_SaveUpdate] @NumberEntry NumberEntry READONLY, @VoucherNo varchar(50), @date varchar(10), @GameMasterId int, @ProfitID int, @TotalAmt int, @CreatedBy int, @Action Varchar(50), @DeviceID varchar(2) AS BEGIN Begin Tran SET NOCOUNT ON; BEGIN TRY declare @CrDateTime datetime =CAST(SWITCHOFFSET(SYSDATETIMEOFFSET(), '+05:30') AS datetime) if @Action = 'Save' begin insert into UserTotalEntry (VoucherNo,date,GameMasterId,ProfitID,TotalAmt,CreatedBy,CreatedOn,DeviceID) values (@VoucherNo , convert(date,('' + @date + ''),103),@GameMasterId, @ProfitId ,@TotalAmt,@CreatedBy,@CrDateTime,@DeviceID) end else if @Action='Update' begin update UserTotalEntry set TotalAmt=@TotalAmt,ModifyOn= @CrDateTime,ModifyBy=@CreatedBy where VoucherNo=@VoucherNo Delete from numberentry where VoucherNo=@VoucherNo end INSERT INTO NumberEntry (VoucherNo,Number,Amount,ID) SELECT VoucherNo,Number,Amount,ID FROM @NumberEntry update numberentry set number='0'+number where len(number)=1 and voucherno=@VoucherNo update numberentry set id = 'BB' where len(number)= 3 and number <> 100 and isnull(id,'') ='' and voucherno=@VoucherNo If (@@Error <> 0) Begin rollback transaction End else commit transaction select ut.voucherno as'VoucherNo' ,g.GameMasterName ,u.UserName as 'AccountName', ut.TotalAmt from usertotalentry ut left join ProfitnLossAc p on p.profitid =ut.profitid left join users u on u.UserId =p.UserId left join gamemaster g on g.GameMasterId= ut.GameMasterId where ut.voucherno=@VoucherNo select 'Entry Saved' as 'Action' END TRY BEGIN CATCH IF @@TRANCOUNT > 0 ROLLBACK TRANSACTION insert into DbErrorLogs SELECT ERROR_NUMBER() AS ErrorNumber ,ERROR_SEVERITY() AS ErrorSeverity ,ERROR_STATE() AS ErrorState ,ERROR_PROCEDURE() AS ErrorProcedure ,ERROR_LINE() AS ErrorLine ,ERROR_MESSAGE() AS ErrorMessage ,@CrDateTime as 'Datetime' ,@CreatedBy as LoginID select 'Entry Failed' as 'Action' END CATCH; END
Gerry Schmitz
Не "вставляйте данные оптом", когда другие процессы обновляют базу данных. Транзакция включает в себя несколько записей, а не "большую часть".
Prashant Sharma
Сэр, пожалуйста, помогите мне любым альтернативным способом, потому что я беру данные из datagrid и передаю их в datatable, если я использую цикл, то это займет много времени.
Gerry Schmitz
Это потребует знания времени выполнения и рабочих графиков. Редизайн потребует знания бизнес-правил.