C#里面的事物回滚,解决同步数据插入时出现重复数据

什么是事物回滚:

       举个栗子,你在你家的银行分行取钱,取完钱数据要同步,而且可能每个分行都有一个存储这些数据的数据库,分行的这些

存取的记录都需要实时同步,如果你取完500刚好断电了,好嘛,分行可能刚记下信息,没那么快同步到别的分行,银行来电之后怎么恢复数据?

这就需要数据支持事物,以保证数据同步的时候不发生问题。

      这里贴一段代码,先看下事物怎么用:

        public bool ExcuteSqlTran(string DbType, ArrayList SqlStringList)
        {
            using (IDbConnection iConn = GetConnection(DbType))
            {
                iConn.Open();
                using (IDbCommand iCmd = GetCommand(DbType))
                {
                    iCmd.Connection = iConn;
                    using (IDbTransaction iDbTran = iConn.BeginTransaction())
                    {
                        iCmd.Transaction = iDbTran;
                        try
                        {
                            for (int n = 0; n < SqlStringList.Count; n++)
                            {
                                string StrSql = SqlStringList[n].ToString();
                                if (StrSql.Trim().Length > 1)
                                {
                                    iCmd.CommandText = StrSql;
                                    iCmd.ExecuteNonQuery();
                                }
                            }
                            iDbTran.Commit();
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine("ExcuteSqlTran" + ex.Message);
                            iDbTran.Rollback();
                            return false;
                        }
                        finally
                        {
                            if (iConn.State != ConnectionState.Closed)
                            {
                                iConn.Close();
                            }
                        }
                    }
                }
                return true;
            }
        }

这里IDbTransaction iDbTran = iConn.BeginTransaction();代表的就是开始一个事物,执行正确了就Commit,错误了就rollback,也就是执行事物回滚
    上面给的代码是一个执行多行SQL语句的事物例子,主要是为了解决数据同步的时候重复插入的问题,我做项目的时候正巧遇到过这种情况,部署一个服务到服务器上,然后其他服务器上同步过来的数据出现大量重复,就可以用事物回滚的方式
来解决这种同步的痛点,如果是单条数据语句执行怎么防止重复,很简单,把上面的例子给改一下,就可以解决这个问题
        public bool ExcuteSqlTran(string DbType, string StrSql)
        {
            using (IDbConnection iConn = GetConnection(DbType))
            {
                iConn.Open();
                using (IDbCommand iCmd = GetCommand(DbType))
                {
                    iCmd.Connection = iConn;
                    using (IDbTransaction iDbTran = iConn.BeginTransaction())
                    {
                        iCmd.Transaction = iDbTran;
                        try
                        {
                            
                                string StrSql = StrSql.ToString();
                                if (StrSql.Trim().Length > 1)
                                {
                                    iCmd.CommandText = StrSql;
                                    iCmd.ExecuteNonQuery();
                                }
                            iDbTran.Commit();
                        }
                        catch (Exception ex)
                        {
                            Debug.WriteLine("ExcuteSqlTran" + ex.Message);
                            iDbTran.Rollback();
                            return false;
                        }
                        finally
                        {
                            if (iConn.State != ConnectionState.Closed)
                            {
                                iConn.Close();
                            }
                        }
                    }
                }
                return true;
            }
        }

这个只是简单介绍一下事物的用法,具体还分很多,比如显式事物,隐式事物等等,这里就不在举栗子说明了,上面两段代码其实就封装在我的SQL Helper类里面,可以去看看



posted @ 2018-04-04 21:42  饮雪俊枫  阅读(660)  评论(0编辑  收藏  举报