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类里面,可以去看看



  • 相关阅读:
    Atos cannot get symbols from dSYM of archived application
    iOS 中捕获程序崩溃日志 (2014-04-22 17:35:59)
    mysql创建索引
    maven整理项目spring配置文件加载问题
    js继承
    创建对象的方式
    js闭包
    js两种创建对象方式
    shiro-web整合
    shiro连接数据库
  • 原文地址:https://www.cnblogs.com/yinxuejunfeng/p/8719404.html
Copyright © 2011-2022 走看看