后台代码中使用事务

  • 首先来谈什么是事务
    • 事务的四大特性
      • 原子性 (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# 后端代码中使用事务相关推荐

  1. c# mysql代码中写事务_代码中添加事务控制 VS(数据库存储过程+事务) 保证数据的完整性与一致性...

    [c#]代码库代码中使用事务前提:务必保证一个功能(或用例)在同一个打开的数据连接上,放到同一个事务里面操作. 首先是在D层添加一个类为了保存当前操作的这一个连接放到一个事务中执行,并事务执行打开同一 ...

  2. java代码中添加事务_C#和JAVA中编写事务代码

    C#  DAL层代码,执行多条增删改,使用事务操作: /// /// 执行 多条增删改 (非查询语句) /// /// /// /// public static int ExcuteNonQuery ...

  3. Camstar开发思考:如何在C#代码中控制事务

    目录 开发现状 开发问题 解决方案 1)自定义UserFunction 2)预调用服务 预调用服务方案设计与实现 代码设计 实现结果 开发现状 Camstar开发过程中,业务代码通常写在以下位置: 1 ...

  4. 解决前后端分离中文件传输跨域失败问题

    笔者在之前的开发中就遇到过这种情况:给与后端的文件下载接口,我在浏览器在postman上试过都是可以的,但在前端上就报这种错误: 看上面的介绍是说前后端跨域问题,可是后端代码中明明配置了放行所有请求, ...

  5. springmvc开启事务_在Controller中添加事务管理

    写这篇文章之前先说明一下: 1. Controller中添加事务管理,是可行的,但是强烈不推荐,因为不符合实际开发场景,还会导致一系列问题 2. 事务请在Service处理,所有的业务逻辑请写在 Se ...

  6. HIbernate中的事务

    什么是事务 在数据库操作中,一项事务(Transaction)是由一条或多条操作数据库的SQL语句组成的一个不可分割的工作单元.当事务中的所有操作都正常完成时,整个事务才能被提交到数据库中,如果有一项 ...

  7. spring mvc后端代码实现弹出对话框_Spring(3)——事务管理和MVC

    事务管理: 使用AspectJ的AOP配置管理事务 <?xml version="1.0" encoding="UTF-8"?> <beans ...

  8. 使用docker中的apline部署自己的golang的后端代码(添加制作静态服务器的注意点)...

    1.在window上写golang后端代码 2.打开终端设置临时的Linux的环境变量: SET CGO_ENABLED=0 SET GOOS=linux SET GOARCH=amd64 如下图所示 ...

  9. SAP中锁定事务代码

    SAP中的事务码非常多,但通常在企业的权限中,用户的权限只是所有事务码的一个子集.有时基于某种业务控制需求,需要在系统中禁用某项功能:比如,在盘点时,可以通过锁定库存查询事务来禁止用户的库存查询操作, ...

  10. mysql 插入数据会执行事务吗_在代码中,插入数据到数据库时,如果不使用事务,将会导致速度极慢...

    今天测试,150条数据,调用jdbcTemplate.batchUpdate语句时,未开启事务的情况下,6m左右才能执行完,开启事务后,几百毫秒即可执行完,差距是非常大的. 因为是在一个线程池中执行的 ...

最新文章

  1. springMVC的使用
  2. Switch-case语句
  3. Android中使用的数据单位
  4. 网络连接的net命令
  5. 批处理 安卓一键打包脚本快速解析
  6. 每天一道算法题(27)——找出元音字母并排序
  7. python字符串转整数_Python连接字符串和整数
  8. 【新手可看懂】ubuntu配置appium环境
  9. python爬虫英文单词_Python_爬虫百度英文学习词典
  10. 视频编解码学习之四:视频处理及编码标准
  11. Java经典for循环题目:兔子繁殖问题
  12. idou老师教你学Istio: 如何用Istio实现K8S Egress流量管理
  13. 三个团队的站立会议旁观笔记
  14. 使用Python实现滚动的广告屏幕
  15. BW型、CB I型、CB II型和椭圆模拟低通滤波器设计的Matlab仿真
  16. 对载荷谱进行雨流计数的几个主要步骤(以四点雨流计数为例)
  17. iOS-开发者相关的几种证书
  18. 【pytorch】错误:No module named ‘typing_extensions‘ 问题解决
  19. Zoom视频会议软件使用
  20. 淘宝电影成全国最大在线选座平台 覆盖702家影院

热门文章

  1. 如何用c语言读文件,如何用C语言读写文件
  2. LDAP认证-ldap介绍
  3. 计算机ppt实验报告总结怎么写,ppt实验报告总结.doc
  4. 玩转 ESP32 + Arduino (二十二) SIM800L上传数据到阿里IOT(温湿度和LBS)(NTP对时)
  5. 电商系统数据库设计原则
  6. Google地图3D城市模型下载最新实践
  7. adb 黑域app_黑域ADB报错解决方法
  8. 黑马python培训网盘资源
  9. QT-C++ 注册机软件,生成机器码和注册码,支持授权时间
  10. 机器人正运动学(3)—— 坐标系及其变换