【问题标题】:Database deadlock when firing triggers触发触发器时数据库死锁
【发布时间】:2012-02-23 22:47:45
【问题描述】:

我使用线程,当我提交数据时,我会触发死锁。如何防止数据库死锁?触发检查行是否存在,如果存在则回滚..

我读了这篇,但没有多大帮助:

http://www.sql-server-performance.com/2006/deadlocks/

http://blog.sqlauthority.com/2007/05/16/sql-server-fix-error-1205-transaction-process-id-was-deadlocked-on-resources-with-another-process-and-has-been-chosen-as-the-deadlock-victim-rerun-the-transaction/

如何避免这个错误?

代码:

advertismentsDao.Save(ad);
advertismentsDao.CommitChanges();

并提交触发此触发器

ALTER TRIGGER [dbo].[TRG_ViolateAdvertisements] ON [dbo].[Advertisements]
AFTER INSERT, UPDATE
AS
BEGIN
   IF EXISTS (SELECT 1 FROM INSERTED ins JOIN dbo.Advertisements ad
                   ON ISNULL(ins.Price, 0) = ISNULL(ad.Price, 0)
                   AND ISNULL(ins.HollidayDuration, 0) = ISNULL(ad.HollidayDuration, 0)
                   AND ISNULL(ins.Name, 0) = ISNULL(ad.Name, 0)
                   AND ISNULL(ins.Description, 0) = ISNULL(ad.Description, 0)
                   AND ISNULL(ins.Cities_idCities, 0) = ISNULL(ad.Cities_idCities, 0)
                   AND ISNULL(ins.Areas_idAreas, 0) = ISNULL(ad.Areas_idAreas, 0)
                   AND ISNULL(ins.Countries_idCountries, 0) = ISNULL(ad.Countries_idCountries, 0)
                   AND ins.Agencies_idAgencies = ad.Agencies_idAgencies
                   --AND ins.Url = ad.Url
                   HAVING COUNT(1) > 1)
   BEGIN
       RAISERROR ('Unique constraint violation in dbo.Advertisements', 16, 1)
       ROLLBACK TRAN;
   END
END

但我得到错误:

事务(进程 ID 78)在锁定资源上与另一个进程死锁,并已被选为死锁牺牲品。重新运行 交易。
堆栈跟踪:
在 System.Data.SqlClient.SqlConnection.OnError(SqlException 异常, 布尔中断连接)
在 System.Data.SqlClient.SqlInternalConnection.OnError(SqlException 异常,布尔型 breakConnection)
在 System.Data.SqlClient.TdsParser.ThrowExceptionAndWarning()
在 System.Data.SqlClient.TdsParser.Run(RunBehavior runBehavior,SqlCommand cmdHandler,SqlDataReader 数据流, BulkCopySimpleResultSet bulkCopyHandler, TdsParserStateObject stateObj)
在 System.Data.SqlClient.SqlDataReader.ConsumeMetaData()
在 System.Data.SqlClient.SqlDataReader.get_MetaData()
在 System.Data.SqlClient.SqlCommand.FinishExecuteReader(SqlDataReader ds, RunBehavior runBehavior, String resetOptionsString)
在 System.Data.SqlClient.SqlCommand.RunExecuteReaderTds(CommandBehavior cmdBehavior、RunBehavior runBehavior、布尔 returnStream、布尔 异步)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法,DbAsyncResult 结果)
在 System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior、RunBehavior、runBehavior、布尔返回流、字符串 方法)
在 System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior 行为,字符串方法)
在 System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior 行为)
在 System.Data.Common.DbCommand.System.Data.IDbCommand.ExecuteReader()
在 NHibernate.AdoNet.AbstractBatcher.ExecuteReader(IDbCommand cmd)
在 NHibernate.Id.IdentityGenerator.InsertSelectDelegate.ExecuteAndExtract(IDbCommand 插入,ISessionImplementor 会话)
在 NHibernate.Id.Insert.AbstractReturningDelegate.PerformInsert(SqlCommandInfo insertSQL, ISessionImplementor session, IBinder binder)

【问题讨论】:

标签: c# sql-server multithreading


【解决方案1】:

改为使用唯一约束。

示例:

Alter Table Advertisements
ADD Constraint Advertisements_UQ1 Unique (
   Price,
   HollidayDestination,
   Name,
   Description,
   Cities_idCities,
   Areas_idAreas,
   Countries_idCountries,
   Agencies_idAgencies
)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-08-06
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多