DELETE不删除时如何失败?

时间:2009-06-29 23:09:03

标签: c# sqlite concurrency

我遇到的问题是我可以删除但是当我点击刷新并发送帖子数据时它会再次尝试删除。这不是问题,但现在第二个问题是一个问题,因为它不应该减少。

什么是并发安全的减少方法,但只有删除删除了一个条目?注意msgId是PK所以我要么删除0或1

public void removeMediaMsg(long userId, long msgId)
{
    using (var dbTrans = connection.BeginTransaction())
    {
        command.CommandText = "DELETE FROM user_media_subscription "
            + "WHERE msgId=@msgId AND recipientId=@recipientId;";
        command.Parameters.Add("@msgId", DbType.Int64).Value = msgId;
        command.Parameters.Add("@recipientId", DbType.Int64).Value = userId;
        command.ExecuteNonQuery();

        command.CommandText = "UPDATE user_data SET mediaMsgCount=mediaMsgCount-1 WHERE userId=@userId;";
        command.Parameters.Add("@userId", DbType.Int64).Value = userId;
        command.ExecuteNonQuery();
        dbTrans.Commit();
    }
}

3 个答案:

答案 0 :(得分:1)

ExecuteNonQuery()返回受影响的行数,因此这样的行为可能会起作用

public void removeMediaMsg(long userId, long msgId)
{
    using (var dbTrans = connection.BeginTransaction())
    {
        command.CommandText = "DELETE FROM user_media_subscription "
            + "WHERE msgId=@msgId AND recipientId=@recipientId;";
        command.Parameters.Add("@msgId", DbType.Int64).Value = msgId;
        command.Parameters.Add("@recipientId", DbType.Int64).Value = userId;
        int affected = command.ExecuteNonQuery();
        if (affected == 1) {
            command.CommandText = "UPDATE user_data SET mediaMsgCount=mediaMsgCount-1 WHERE userId=@userId;";
            command.Parameters.Add("@userId", DbType.Int64).Value = userId;
            command.ExecuteNonQuery();
        }
        dbTrans.Commit();    
    }
}

也就是说,您应该对应用进行编程,以避免在刷新时重播命令。一种方法是使用重定向或仅在成功删除后呈现不同的视图。

答案 1 :(得分:1)

我从“当我点击刷新”声明中猜测你是从ASP.NET执行的。我发现有用的是使用Response.Redirect跟踪事务到摘要页面。这样点击刷新不会重复删除命令。

答案 2 :(得分:0)

在删除之前执行选择查询以在表中检查它是个好主意。如果不是,你可以返回该功能而不做任何其他事情。