C# 后端代码中使用事务
后台代码中使用事务
- 首先来谈什么是事务
- 事务的四大特性
- 原子性 (Atomic)
- 一致性(Consistency)
- 持久性(Durability)
- 隔离性(Isolation)
- 可能会出现的问题
- 后端代码中使用事务
首先来谈什么是事务
在数据库中简单的解释就是,“单个或者多个sql操作组成的一个逻辑单元”。
事务的四大特性
原子性 (Atomic)
每一个事务都是一个不可分割的工作单位。这些操作要么全部执行,要么全都不执行。在某个操作失败后,回滚到事务执行之前的状态。
回滚:大多数DB的事务造作只是在数据快照中进行,不修改实际数据,如果出错数据进行自然回滚。 支持简单事务的系统(例:NO-SQL)中,不会在快照上更新,而直接操作实际数据。先预演一边所有要执行的操作,如果失败则这些操作不会被执行。
一致性(Consistency)
事务对数据完整性约束的遵循。这些约束可能包括主键约束、外键约束或是一些用户自定义约束。事务执行的前后都是合法的数据状态,不会违背任何的数据完整性。
持久性(Durability)
事务一旦被提交,那么数据一定会被写入到数据库中并持久储存起来。
隔离性(Isolation)
一个事务的执行不能被其他事务干扰。即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。
可能会出现的问题
- 问题:
- 脏读:“后一个事务”读到了“前一个事务”未提交的更新结果,如果“前一个事务”提交失败,“后一个事务”读到的就是脏数据。
- 不可重复读:“后一个事务” 在 “前一个事务”提交前读到的结果和提交后读到的结果可能不同而产生不可重复读。通过MVCC(Multi-Version Concurrency Control 多版本并发控制)可以在无锁的情况下,避免不可重复读。
- 幻读:“前一个事务”新增了一条记录,”后一个事务“在“前一个事务”提交前后各执行了一次查询操作,发现后一次比前一次多了一条记录。事务串行化(多个事务的重要操作按时间排序的一个序列),才能避免幻读
- 事务的隔离级别:
- Read Uncommitted:最低的隔离级别,一个事务可以读到另一个事务未提交的结果,所有的并发事务问题都会发生。
- Read Committed:只有在事务提交后,其更新结果才会被其他事务看见。可以解决脏读问题
- Repeated Read:在一个事务中,对于同一份数据,无论是否有其他事务对这份数据进行操作,以及这个事务是否提交 读取结果总是相同的。可以解决脏读、不可重复读
- Serialization:事务串行化执行,隔离级别最高,牺牲了系统的并发性。可以解决并发事务的所有问题。
后端代码中使用事务
使用mysql连接数据为例:
using (MySqlConnection conn = new MySqlConnection(”数据库链接字符串“)){if (conn.State == ConnectionState.Closed){conn.Open();}using (MySqlTransaction trans = conn.BeginTransaction()){try{if(ExecuteSql(trans, sqlstr)==1){trans.Commit();}else{trans.Rollback()}}catch (Exception){trans.Rollback();throw;}}
}
//trans:事务 sqlstr:操作数据库的字符串
public int ExecuteSql(MysqlTransaction trans,string sqlstr)
{//此处可以进行封装,每次去调用{if (trans != null) cmd.Transaction = trans;cmd.Connection = trans.Connection;cmd.CommandText = sqlstr;cmd.BindByName = true;cmd.CommandType = CommandType.Text;//cmdType;if (cmdParms != null){//清除很重要 cmd.Parameters.Clear();foreach (MysqlParameter parm in cmdParms){if (parm.Value == null){parm.Value = DBNull.Value;}else if (parm.Value.GetType() == typeof(string)){//parm.Size = -1;parm.Value = StringHelper.Big5ToGB(parm.Value.ToString().Trim());}else if (parm.Value.GetType() == typeof(char[])){string charstr = new string((char[])parm.Value);parm.Value = StringHelper.Big5ToGB(charstr.Trim()).ToCharArray();}}cmd.Parameters.AddRange(cmdParms.ToArray());}}//执行sql操作,并返回结果int rows = cmd.ExecuteNonQuery();//清除很重要cmd.Parameters.Clear();return rows;
}
这就是一个事务的基本逻辑
所需要的注意的点就是 cmd.Parameters.Clear(); 解除它对其它对象的引用
C# 后端代码中使用事务相关推荐
- c# mysql代码中写事务_代码中添加事务控制 VS(数据库存储过程+事务) 保证数据的完整性与一致性...
[c#]代码库代码中使用事务前提:务必保证一个功能(或用例)在同一个打开的数据连接上,放到同一个事务里面操作. 首先是在D层添加一个类为了保存当前操作的这一个连接放到一个事务中执行,并事务执行打开同一 ...
- java代码中添加事务_C#和JAVA中编写事务代码
C# DAL层代码,执行多条增删改,使用事务操作: /// /// 执行 多条增删改 (非查询语句) /// /// /// /// public static int ExcuteNonQuery ...
- Camstar开发思考:如何在C#代码中控制事务
目录 开发现状 开发问题 解决方案 1)自定义UserFunction 2)预调用服务 预调用服务方案设计与实现 代码设计 实现结果 开发现状 Camstar开发过程中,业务代码通常写在以下位置: 1 ...
- 解决前后端分离中文件传输跨域失败问题
笔者在之前的开发中就遇到过这种情况:给与后端的文件下载接口,我在浏览器在postman上试过都是可以的,但在前端上就报这种错误: 看上面的介绍是说前后端跨域问题,可是后端代码中明明配置了放行所有请求, ...
- springmvc开启事务_在Controller中添加事务管理
写这篇文章之前先说明一下: 1. Controller中添加事务管理,是可行的,但是强烈不推荐,因为不符合实际开发场景,还会导致一系列问题 2. 事务请在Service处理,所有的业务逻辑请写在 Se ...
- HIbernate中的事务
什么是事务 在数据库操作中,一项事务(Transaction)是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元.当事务中的所有操作都正常完成时,整个事务才能被提交到数据库中,如果有一项 ...
- spring mvc后端代码实现弹出对话框_Spring(3)——事务管理和MVC
事务管理: 使用AspectJ的AOP配置管理事务 <?xml version="1.0" encoding="UTF-8"?> <beans ...
- 使用docker中的apline部署自己的golang的后端代码(添加制作静态服务器的注意点)...
1.在window上写golang后端代码 2.打开终端设置临时的Linux的环境变量: SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 如下图所示 ...
- SAP中锁定事务代码
SAP中的事务码非常多,但通常在企业的权限中,用户的权限只是所有事务码的一个子集.有时基于某种业务控制需求,需要在系统中禁用某项功能:比如,在盘点时,可以通过锁定库存查询事务来禁止用户的库存查询操作, ...
- mysql 插入数据会执行事务吗_在代码中,插入数据到数据库时,如果不使用事务,将会导致速度极慢...
今天测试,150条数据,调用jdbcTemplate.batchUpdate语句时,未开启事务的情况下,6m左右才能执行完,开启事务后,几百毫秒即可执行完,差距是非常大的. 因为是在一个线程池中执行的 ...
最新文章
- springMVC的使用
- Switch-case语句
- Android中使用的数据单位
- 网络连接的net命令
- 批处理 安卓一键打包脚本快速解析
- 每天一道算法题(27)——找出元音字母并排序
- python字符串转整数_Python连接字符串和整数
- 【新手可看懂】ubuntu配置appium环境
- python爬虫英文单词_Python_爬虫百度英文学习词典
- 视频编解码学习之四:视频处理及编码标准
- Java经典for循环题目:兔子繁殖问题
- idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理
- 三个团队的站立会议旁观笔记
- 使用Python实现滚动的广告屏幕
- BW型、CB I型、CB II型和椭圆模拟低通滤波器设计的Matlab仿真
- 对载荷谱进行雨流计数的几个主要步骤(以四点雨流计数为例)
- iOS-开发者相关的几种证书
- 【pytorch】错误:No module named ‘typing_extensions‘ 问题解决
- Zoom视频会议软件使用
- 淘宝电影成全国最大在线选座平台 覆盖702家影院
热门文章
- 如何用c语言读文件,如何用C语言读写文件
- LDAP认证-ldap介绍
- 计算机ppt实验报告总结怎么写,ppt实验报告总结.doc
- 玩转 ESP32 + Arduino (二十二) SIM800L上传数据到阿里IOT(温湿度和LBS)(NTP对时)
- 电商系统数据库设计原则
- Google地图3D城市模型下载最新实践
- adb 黑域app_黑域ADB报错解决方法
- 黑马python培训网盘资源
- QT-C++ 注册机软件,生成机器码和注册码,支持授权时间
- 机器人正运动学(3)—— 坐标系及其变换