zoukankan      html  css  js  c++  java
  • 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类里面,可以去看看



  • 相关阅读:
    Trie树详解及其应用
    最长回文字符串_Manacher算法_(O(n))
    设置VisualStudio以管理员身份运行
    wcf使用JetEntityFrameworkProvider.dll写access数据库时,报"操作必须使用一个可更新的查询"错误的解决办法
    data:image字符转byte[]
    ID为XXXX的进程当前未运行
    在Windows2003 server 64位系统上使用ArcEngine开发的WCF服务
    关于position的relative和absolute分别是相对于谁进行定位的
    sql语句进行写数据库时,字符串含有'的处理方式
    EF中关于日期字值的处理
  • 原文地址:https://www.cnblogs.com/yinxuejunfeng/p/8719404.html
Copyright © 2011-2022 走看看