什么是事物回滚:
举个栗子,你在你家的银行分行取钱,取完钱数据要同步,而且可能每个分行都有一个存储这些数据的数据库,分行的这些
存取的记录都需要实时同步,如果你取完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类里面,可以去看看