寻找有关如何正确处理数据库对象以及可能需要清理哪些内容的建议

Looking for advice on how to properly dispose of database objects and what cleaning up may be necessary

我试图在用户 "updates" 一条记录时在单个事务中对数据库 table 执行两次更新。首先,我通过将取消日期设置为等于生效日期来 "cancel out" 原始记录。然后,我使用提供的值输入一个新记录。这就是我们记录更新历史的方式。

我正在寻找有关如何正确处理数据库对象以及可能需要进行哪些清理的建议。比如我的"using"块合理吗?我是否可以假设如果事务已启动但在事务启动后的任何地方出现问题,则隐含回滚发生?

    public void UpdateStateAssessment(Models.StateAssessment stateAssessment)
    {
        string updateSql = @"UPDATE GSAS.ST_ASSMT_REF 
                          SET 
                             CAN_DT       = EFF_DT  
                          WHERE
                               VENDR_ID = @VENDR_ID AND
                               EFF_DT   = @EFF_DT   AND
                               LAST_TS  = @LAST_TS";

        string insertSql = @"INSERT INTO GSAS.ST_ASSMT_REF 
                        (
                         VENDR_ID   
                        ,ST_ASSMT_NM    
                        ,ST_CD  
                        ,EFF_DT 
                        ,CAN_DT 
                        ,LAST_TS    
                        ,LAST_OPER_ID      
                        )
                        VALUES
                        (
                         @VENDR_ID
                        ,@ST_ASSMT_NM
                        ,@ST_CD
                        ,@EFF_DT
                        ,@CAN_DT
                        ,CURRENT TIMESTAMP    
                        ,@LAST_OPER_ID
                        )";

        try
        {
            using (var connection = OpenConnection())
            {
                DB2Transaction sqltransaction = connection.BeginTransaction(IsolationLevel.ReadCommitted);

                using (sqltransaction)
                {
                    using (DB2Command cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = updateSql;
                        cmd.CommandType = CommandType.Text;
                        cmd.Transaction = sqltransaction;
                        cmd.Connection = connection;
                        cmd.Parameters.Add(new DB2Parameter("@CAN_DT", DB2Type.Date) { Value = stateAssessment.CancelDate.Date });
                        cmd.Parameters.Add(new DB2Parameter("@VENDR_ID", DB2Type.Char) { Value = stateAssessment.VendorId });
                        cmd.Parameters.Add(new DB2Parameter("@EFF_DT", DB2Type.Date) { Value = stateAssessment.EffectiveDate.Date });
                        cmd.Parameters.Add(new DB2Parameter("@LAST_TS", DB2Type.DateTime) { Value = stateAssessment.LastTimestamp });
                        cmd.ExecuteNonQuery();
                    }

                    using (DB2Command cmd = connection.CreateCommand())
                    {
                        cmd.CommandText = insertSql;
                        cmd.CommandType = CommandType.Text;
                        cmd.Transaction = sqltransaction;
                        cmd.Connection = connection;
                        cmd.Parameters.Add(new DB2Parameter("@ST_ASSMT_NM", DB2Type.Char) { Value = stateAssessment.Name });
                        cmd.Parameters.Add(new DB2Parameter("@ST_CD", DB2Type.Char) { Value = stateAssessment.StateCode });
                        cmd.Parameters.Add(new DB2Parameter("@CAN_DT", DB2Type.Date) { Value = stateAssessment.CancelDate.Date });
                        cmd.Parameters.Add(new DB2Parameter("@LAST_OPER_ID", DB2Type.Char) { Value = stateAssessment.LastOperatorId });
                        cmd.Parameters.Add(new DB2Parameter("@VENDR_ID", DB2Type.Char) { Value = stateAssessment.VendorId });
                        cmd.Parameters.Add(new DB2Parameter("@EFF_DT", DB2Type.Date) { Value = stateAssessment.EffectiveDate.Date });
                        cmd.ExecuteNonQuery();
                    }

                    sqltransaction.Commit();
                }
            }
        }
        catch (Exception exception)
        {
            //Log the error.
            //Any Cleaning up to do?
        }
    }

您的一次性物品都被正确地包裹在一个 using 块中,因此即使出现异常,它们也会被丢弃。

因为命令包含在事务中,所以在提交事务之前它们不会被提交。如果第一个命令执行但第二个命令抛出异常,则事务将不会提交。

documentation 表示如果未提交则显式回滚事务。

sqltransaction.Rollback();