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来进行事务回滚,即是要么全部成功要么全部不成功.如下代码 // ...
随机推荐
- 下拉框select中option居中样式
下拉框select中option居中样式 text-align:center;text-align-last:center;
- 试着用java实现DNS(一)——DatagramSocket, DatagramPacket, Message
一般来说,自己编写DNS是没有必要的,目前开源的dns服务软件很多,功能也很强大.但是,有时候又是很有必要的,有着诸多好处.比如说,用于企业内网,简化DNS配置,可以根据企业需求添加新的功能,非常灵活 ...
- javascript window对象属性和方法
window对象 window对象表示一个浏览器窗口或一个框架.在客户端JavaScript中,window对象是全局对象,所有的表达式 都在当前的环境中计算.也就是说,要引用当前窗口根本不需要特殊的 ...
- Failed to start docker.service: Unit not found.
安装教程参考: https://docs.docker.com/install/linux/docker-ce/centos/#install-docker-ce-1 https://yq.aliyu ...
- POJ 2704
#include <iostream> #include <string> #define LL long long #define MAXN 100 using namesp ...
- POJ 2509
#include <iostream> #include <stdio.h> using namespace std; int main() { //freopen(" ...
- 05-02 Java 一维数组、内存分配、数组操作
数组的定义 动态初始化 /* 数组:存储同一种数据类型的多个元素的容器. 定义格式: A:数据类型[] 数组名; B:数据类型 数组名[]; 举例: A:int[] a; 定义一个int类型的数组a变 ...
- hybird app混合开发介绍
一 概念 1 Hybird App,是用现有前端(html,js,css)技术来开发的app.特点:1 灵活(开发灵活 ,部署灵活) 2 拥有类似原生的性能体验. 2 不是h5页面,也不是在webvi ...
- 课程一(Neural Networks and Deep Learning),第一周(Introduction to Deep Learning)—— 0、学习目标
1. Understand the major trends driving the rise of deep learning.2. Be able to explain how deep lear ...
- (转)Python3之pickle模块
原文:https://www.cnblogs.com/wang-yc/p/5616579.html https://www.cnblogs.com/yuanzhaoyi/p/6093362.html- ...