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 = ; n < SqlStringList.Count; n++)
{
string StrSql = SqlStringList[n].ToString();
if (StrSql.Trim().Length > )
{
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 > )
{
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类里面,可以去看看
C#里面的事物回滚,解决同步数据插入时出现重复数据的更多相关文章
- Spring-Java事物回滚失效处理
spring-Java事物回滚失效处理最近在做项目中,无意间发现有个类在抛事物回滚操作,数据也正常的插入到数据库当中了,于是仔细查看看一下具体原因. 一切还是要从Java的检查型异常和非检查型异常说起 ...
- msql,触发器无事物回滚,插入之前满足条件再插入
很少写mysql的触发器和存储过程,由于需要需要做一个很小的判断,要用到触发器,要达到的效果就是,插入之前判断是否满足条件如果不满足就不插入 如果用sqlserver 或者orcale 就很简单,按s ...
- 复习课程jdbc:使用配置文件properties进行连接数据库,数据库存取图片,批处理,时间戳,事物回滚等等
使用配置文件properties进行连接数据库 首先创建一个file自定义文件名,但是后缀名必须改为.properties(不分大小写):如config.properties: 然后双击config. ...
- Spring aop切面插入事物回滚
<!-- tx标签配置 事物--> <tx:advice id="txadvice" transaction-manager="transactionM ...
- springboot事物回滚
要添加事物 必须在方法上添加 @Transactional 注解 如果需要事物回滚有两个条件 1.方法中有异常或者主动抛异常 2.主动去回滚 TransactionAspectSupport.curr ...
- peewee 事物 回滚
peewee 事物 回滚 #!/usr/bin/env python # coding=utf-8 from peewee import * db = MySQLDatabase(host='123. ...
- django事物回滚
往数据库写入数据时,不经意间就会写入不完整的数据,我们称之为脏数据.事务管理(transaction)可以防止这种情况发生.事务管理一旦检测到写入异常,会执行回滚操作,即要么写入完整的数据,要么不写入 ...
- ThinkPHP数据库驱动之mysql事物回滚
1.开启事务方法 startTrans()2.事务提交方法 commit()3.事务回滚方法 rollback() 用法例子: $order = M(‘order’); $allAdded = tru ...
- C#使用SqlTransaction事务回滚与SqlBulkCopy批量插入数据
C#中批量处理数据,有时候因为一条记录导致整个批量处理失败.这时候肯能会导致数据不全等问题,这时候我们可以使用SqlTransaction来进行事务回滚,即是要么全部成功要么全部不成功.如下代码 // ...
随机推荐
- Network - Tips
001 - 查询whois 可通过在线工具进行查询: https://www.whois365.com http://whois.aliyun.com http://whois.chinaz.com ...
- GPS轨迹数据可视化的三种途径
有一阵子没写过博客了,最近因为自己小队申请了项目有并且要帮研究生做一些数据处理的小任务,接触到可视化.这里介绍最近学到的了三种方法. 第一种是用python. 这里原理是用matplotlib里面的s ...
- async await 的执行
async await的执行 注意:本次代码仅在 Chrome 73 下进行测试. start 不了解 async await 的,先去看阮一峰老师的文章async 函数. 先来看一道头条的面试题,这 ...
- Python多线程-Event(事件对象)
Event 事件对象管理一个内部标志,通过set()方法将其设置为True,并使用clear()方法将其设置为False.wait()方法阻塞,直到标志为True.该标志初始为False. 方法: i ...
- (转载)es进行聚合操作时提示Fielddata is disabled on text fields by default
原文地址:http://blog.csdn.net/u011403655/article/details/71107415 根据es官网的文档执行 GET /megacorp/employee/_se ...
- 持续集成 TeamCity 的配置与使用
环境:实现自动编译与自动化测试,发布到远程服务器,环境 VS2015 +WIN2008R2 什么是TeamCity TeamCity是由Jetbrains开发的一款功能强大的持续集成(Continue ...
- vue代码上传服务器后背景图片404解决方法
问题:代码上传服务器后,图片404,使用的font-awesome图标也是404 解决办法: 如果你用了vue-cil,那么在build目录下找到utils.js中的ExtractTextPlugin ...
- 根据js来判断手机是操作系安卓还是ios
平常开发很常见的功能,在移动端需要根据javaScript来判断手机是安卓还是ios进行应用市场跳转. 通过js提供的Navigator可以来判断手机是安卓还是ios系统,代码如下 1.js判断是否为 ...
- OSRM笔记
OSRM OSRM(OpenStreetMap Routeing Machine)可用于路线规划.作为高性能的路线规划引擎,OSRM使用C++14编写,基于开源的OpenStreetMap数据实现. ...
- java学习-http中get请求的非ascii参数如何编码解码探讨
# 背景: 看着别人项目代码看到一个PathUtils工具类, 里面只有一个方法,String rebuild(String Path),将路径进行URLDecoder.decode解码,避免路径中 ...