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

[c#]代码库代码中使用事务前提:务必保证一个功能(或用例)在同一个打开的数据连接上,放到同一个事务里面操作。

首先是在D层添加一个类为了保存当前操作的这一个连接放到一个事务中执行,并事务执行打开同一个连接、事务完成关闭同一个连接的一个共有类

[csharp] view plaincopyprint?

01.using System;

02.using System.Collections.Generic;

03.using System.Linq;

04.using System.Text;

05.using System.Data;

06.using System.Data.SqlClient;

07.using Maticsoft.DBUtility;

08.namespace PersonalFiles.DAL

09.{

10. public class DBTransaction

11. {

12. private DbHelperSQL SqlHelper = null;

13.

14.

15.

16. public DBTransaction()

17. {

18. SqlHelper = new DbHelperSQL();

19. }

20.

21. ///

22. /// 获取数据库连接

23. ///

24. ///

25. public SqlConnection GetConnection()

26. {

27. return SqlHelper.GetCon();

28. }

29.

30. ///

31. /// 获取事务

32. ///

33. ///

34. public SqlTransaction GetTransaction(SqlConnection conn)

35. {

36. return conn.BeginTransaction();

37. }

38.

39. ///

40. /// 提交事务

41. ///

42. public void Commit(SqlTransaction sqlTransaction)

43. {

44. sqlTransaction.Commit();

45. }

46.

47. ///

48. /// 回滚事务

49. ///

50. public void Rollback(SqlTransaction sqlTransaction)

51. {

52. sqlTransaction.Rollback();

53. }

54.

55. ///

56. /// 关闭连接

57. ///

58. public void Close(SqlConnection conn)

59. {

60.

61. if (conn.State == ConnectionState.Open)

62. {

63. conn.Close();

64. }

65.

66. }

67. }

68.}

69.

界面层的后台代码和以前一样直接调去就行了,现在来看主要是在B层中的代码发生了很大的变化,需要向下层传递事务与获取的连接

[csharp] view plaincopyprint?

01.///

02. /// 增加一条数据

03. ///

04. public void Add(PersonalFiles.Model.BasicInformation modelBasic, PersonalFiles.Model.T_HumanAgency model)

05. {

06. int flag = 0;

07.

08. DBTransaction DbTran = new DBTransaction();

09.

10.

11. //获得连接

12. SqlConnection conn = DbTran.GetConnection();

13.

14.

15.

16. //开启事务

17. SqlTransaction trans = DbTran.GetTransaction(conn);

18. try

19. {

20. //把获得的同一个连接与事务一共传下去

21. //dalBasic.Add(modelBasic,conn,trans);

22.

23. //把获得的同一个连接与事务一共传下去

24.

25. dalAgency.Add(model,conn,trans);

26.

27.

28.

29.

30. //事务提交

31. DbTran.Commit(trans);

32. //return true;

33. }

34.

35. catch (Exception ex)

36. {

37. //回滚事务

38. DbTran.Rollback(trans);

39. }

40. finally

41. {

42. DbTran.Close(conn);

43. }

44. }

注意的是向D层传是我们需要传的是B层获取的同一个连接于开启的是一个事务:

[csharp] view plaincopyprint?

01.///

02. /// 增加一条数据

03. ///

04. public void Add(PersonalFiles.Model.T_HumanAgency model,SqlConnection conn,SqlTransaction trans)

05. {

06. StringBuilder strSql = new StringBuilder();

07. strSql.Append("insert into T_HumanAgency(");

08. strSql.Append("myidentity,relation,receivemode,workingtime,intotime,oldworkplace,nowworkplace,inervice,registered,registeredcardid,registeredid,householder,isrecord,fileintotime,fileouttime,filetowhere,relationouttime,Paymentstandard,paymentsmonth,payments,stoptime,state,pri,admin,ID)");

09. strSql.Append(" values (");

10. strSql.Append("@myidentity,@relation,@receivemode,@workingtime,@intotime,@oldworkplace,@nowworkplace,@inervice,@registered,@registeredcardid,@registeredid,@householder,@isrecord,@fileintotime,@fileouttime,@filetowhere,@relationouttime,@Paymentstandard,@paymentsmonth,@payments,@stoptime,@state,@pri,@admin,@ID)");

11. SqlParameter[] parameters = {

12. new SqlParameter("@myidentity", SqlDbType.VarChar,50),

13. new SqlParameter("@relation", SqlDbType.VarChar,50),

14. new SqlParameter("@receivemode", SqlDbType.VarChar,50),

15. new SqlParameter("@workingtime", SqlDbType.VarChar,50),

16. new SqlParameter("@intotime", SqlDbType.VarChar,50),

17. new SqlParameter("@oldworkplace", SqlDbType.VarChar,50),

18. new SqlParameter("@nowworkplace", SqlDbType.VarChar,50),

19. new SqlParameter("@inervice", SqlDbType.VarChar,50),

20. new SqlParameter("@registered", SqlDbType.VarChar,50),

21. new SqlParameter("@registeredcardid", SqlDbType.VarChar,50),

22. new SqlParameter("@registeredid", SqlDbType.VarChar,50),

23. new SqlParameter("@householder", SqlDbType.VarChar,50),

24. new SqlParameter("@isrecord", SqlDbType.VarChar,50),

25. new SqlParameter("@fileintotime", SqlDbType.VarChar,50),

26. new SqlParameter("@fileouttime", SqlDbType.VarChar,50),

27. new SqlParameter("@filetowhere", SqlDbType.VarChar,50),

28. new SqlParameter("@relationouttime", SqlDbType.VarChar,50),

29. new SqlParameter("@Paymentstandard", SqlDbType.VarChar,50),

30. new SqlParameter("@paymentsmonth", SqlDbType.VarChar,50),

31. new SqlParameter("@payments", SqlDbType.VarChar,50),

32. new SqlParameter("@stoptime", SqlDbType.VarChar,50),

33. new SqlParameter("@state", SqlDbType.VarChar,50),

34. new SqlParameter("@admin", SqlDbType.VarChar,50),

35. new SqlParameter("@pri", SqlDbType.VarChar,50),

36. new SqlParameter("@ID", SqlDbType.VarChar,50)};

37. parameters[0].Value = model.myidentity;

38. parameters[1].Value = model.relation;

39. parameters[2].Value = model.receivemode;

40. parameters[3].Value = model.workingtime;

41. parameters[4].Value = model.intotime;

42. parameters[5].Value = model.oldworkplace;

43. parameters[6].Value = model.nowworkplace;

44. parameters[7].Value = model.inervice;

45. parameters[8].Value = model.registered;

46. parameters[9].Value = model.registeredcardid;

47. parameters[10].Value = model.registeredid;

48. parameters[11].Value = model.householder;

49. parameters[12].Value = model.isrecord;

50. parameters[13].Value = model.fileintotime;

51. parameters[14].Value = model.fileouttime;

52. parameters[15].Value = model.filetowhere;

53. parameters[16].Value = model.relationouttime;

54. parameters[17].Value = model.Paymentstandard;

55. parameters[18].Value = model.paymentsmonth;

56. parameters[19].Value = model.payments;

57. parameters[20].Value = model.stoptime;

58. parameters[21].Value = model.state;

59. parameters[22].Value = model.pri;

60. parameters[23].Value = model.admin;

61. parameters[24].Value = model.ID;

62.

63.

64. //DbHelperSQL.ExecuteSql(strSql.ToString(), parameters);

65. DbHelperSQL.ExecuteSql(strSql.ToString(),conn,trans, parameters);

66. }

在代码中添加事务与存储过程中添加事务的异同

相同点

1:都能够保证数据的一致性。

不同点:

1:代码中添加事务的好处是:增加了代码的可读性、与可维护性,方便后期人员维护系统看代码能够一目了然的看懂代码,而在数据库中添加存储过程的可读性不是很好。

2:为什么不建议使用数据库自带的存储过程+事务呢?主要是一个项目过多的依赖数据库,这样对后期的数据库迁移都会带来一定的影响与不便(sql向oracle迁移),好多转换不是很容易兼容性和不是很好(以后再深入学习)。

3:合作开发时如果是代码中添加事务遵循了代码上传的原则,这样方便大家的交流。

为什么使用事务可以保证同一个连接向数据库多个表写信息的正确性与一致性的原理:

事务的原子性

事务的原子性指的是,事务中包含的程序作为数据库的逻辑工作单位,它所做的对数据改操作要全部执行,要么全部不执行。这种特性称为原子性。 事务的原子性要求,如果把一个事务看作是一个程序,它要么完整的被执行,要么完全执行。就是说事务的操纵序列或者完全应用到数据库或者完全不影响数据库。这种特性称为原则性 假如用户在一个事务内完成了对数据库的更新,这时所有的更新对外部世界必须是可见的,或者完全没有更新。前者称事务已提交,后者称事务撤销。DBMS必须确保由成功提交的事物完成的所有操作在数据库内有完全的反映,而失败的事务对数据库完全没有影响

事务的隔离性

事务开始执行了但是没有提交事务,数据并没有真正的写到数据库里面,当我去断点测试的时候当第一个程序向数据库发出写完时,我去查找数据库不能打开数据库,不能查找,提示连接超时,由于事务的隔离性,数据并没有真正的写到数据库里面,等事务提交才可以查到数据库,可见同一个连接下执行的程序在同一个事务执行的开始于结束后才真正写到数据库里面,如果过程当中保存事务回滚,数据不会写到数据库里面。保证数据的一致性与正确性。

数据的准确性与一致性是我们要时刻考虑的,一个好的系统必须有较好的准确性才能保证用户的使用。

694748ed64b9390909c0d88230893790.png

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/487487.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

AI的“色差”与“纠偏”

来源:脑极体在美国学术界声援BLM(Black Lives Matter)之后,事情的走向有点难以预料。学术界的反种族歧视反省似乎没有了下文,但是如火如荼的BLM运动早已蔓延开来,这次将矛头指向了AI界。事情的起因是杜克大…

英伟达奔驰共同发布自动驾驶系统,还自带停车功能

大数据文摘出品来源:VB编译:白浩然最近,英伟达(Nvidia)宣布为了和奔驰(Mercedes-Benz)汽车紧密合作,计划从2024年开始推出一款车载计算系统和AI基础设施,该技术于去年1月…

【hihocoder 1312】搜索三·启发式搜索(启发式搜索写法)

【题目链接】:http://hihocoder.com/problemset/problem/1312?sid1092363 【题意】 【题解】 定义一个A*函数 f stepval 这里的val是当前这个状态;每个点到目标状态的点的曼哈顿距离的绝对值; (这个值肯定比真正需要花费的路程短) step就为当前状态花费的步数; 把普通…

Gartner发布2020年数据与分析领域的十大技术趋势

来源:Gartner公司近日,Gartner发布了数据与分析领域的十大技术趋势,为数据和分析领导者的新冠疫情(COVID-19)响应和恢复工作提供指导,并为疫情后的重启做好准备。数据和分析领导者如果希望在疫情后能持续创…

java 中文域名转码_转换java方法

java date String 类型相互转换这种转换要用到java.text.SimpleDateFormat类字符串转换成日期类型:方法1:也是最简单的方法 Date datenew Date("2008-04-14");方法2:SimpleDateFormat sdfnew SimpleDateFormat("yyyy-M...文章…

【42.59%】【codeforces 602A】Two Bases

time limit per test1 second memory limit per test256 megabytes inputstandard input outputstandard output After seeing the “ALL YOUR BASE ARE BELONG TO US” meme for the first time, numbers X and Y realised that they have different bases, which complic…

java2019 数据结构算法面试题_2019年JVM最新面试题,必须收藏它

1、JVN内存结构方法区和对是所有线程共享的内存区域;而java栈、本地方法栈和程序员计数器是运行是线程私有的内存区域。Java堆(Heap),是Java虚拟机所管理的内存中最大的一块。Java堆是被所有线程共享的一块内存区域,在虚拟机启动时创建。此内存区域的唯一…

前沿科技 | 中科院科学家研究揭示灵活行动选择的神经机制

来源:中国科学院6月24日,中国科学院科学家团队——脑科学与智能技术卓越创新中心(神经科学研究所)、上海脑科学与类脑研究中心、神经科学国家重点实验室姚海珊研究组在eLife上在线发表了题为《次级运动皮层在灵活视觉分类行为中参…

中科院调查组成立!杨辉发表声明,并对举报信作出详细回应

左:加州大学圣地亚哥分校教授付向东。右:中科院神经所青年 PI 杨辉。图片来源:UCSD/一席演讲来源 BioArtReports 中科院神经所 等整理 科研圈7 月 2 日,网络消息称加州大学圣地亚哥分校细胞和分子医学系教授付向东发布实名举报信&…

java lookandfeel nimbus_动态改变LookAndFeel

LookAndFeel可以改变图形界面的风格,比如说可以将Java的默认界面改变成仿Windows,UNIX等其它风格的界面,主要有以下几种界面风格:metal(默认):"javax.swing.plaf.metal.MetalLookAndFeel"windows:"com.sun.java.sw…

盘点华为系工控企业——中国A股上市公司最多的创业体系

来源:OFweek工控别看今日华为风光无限,美国举国打压下更显华为雄厚实力;但早在2000年左右,全球IT产业泡沫破灭,作为通信设备商,华为也受累进入寒冬,任正非为了鼓励团队士气,写出了著…

Java多线程编程递增_java多线程编程之简介

编写正确的程序很难,编写正确的多线程程序更难。如果对多线程理解的不够深入,编写出来的程序往往跟自己的预期不一样,甚至不知道问题出现在哪里。因此,如果想成为一个好的程序员,掌握多线程是必修的一门功课。多线程带…

JavaScript中的内置对象-8--4.date对象中-获取,设置日期时间的方法; 获取,设置年月日时分秒及星期的方法;...

学习目标 1.掌握创建日期对象的方法 2.掌握date对象中获取日期时间的方法 3.掌握date对象中设置日期时间的方法 如何创建一个日期对象 语法:new Date(); 功能:创建一个日期时间对象 返回值:比传参的情况下,返回当前的日期时间对象…

秦川团队《科学》刊发研究:新冠感染恒河猴康复后不会再感染

来源:澎湃新闻新冠病毒(SARS-CoV-2)肺炎疫情全球大流行的背景下,恢复期患者是否有再次感染的风险目前尚不清楚。来自中国的最新科研成果表明,原发性新冠病毒感染可防止随后再感染,这对新冠患者的预后和下一…

java禁止修改map_Java中实现不可变Map

有时最好不允许修改 java.util.Map, 例如跨线程共享只读数据。为此,我们可以使用Unmodifiable Map或Immutable Map。在这个快速教程中,我们将看到它们之间的区别。然后,我们将介绍可以创建不可变Map的各种方法。不可修改与不可变…

昨夜,5G R16标准正式冻结!5G物联网扬帆起航

作者:赵小飞物联网智库 整理发布转载请注明来源和出处导 读昨天夜里,负责5G标准的国际组织3GPP TSG#88全体会议宣布5G R16标准冻结。在新冠疫情全球肆虐的背景下,标准化推进工作遇到非常大的挑战,而3GPP的专家们依然能…

Linux下grub.cnf详解

grub.conf跟系统启动项有关,对于重置密码。来说小case。。。 1、介绍 在Red Hat Linux7.2之后,默认的引导加载程序从LTLO变为GRUB.这个引导加载程序使用户能够选择何时以及如何引导安装在计算机硬盘上的可引导的操作系统。 2、说明 变量 说…

(二)用户相关操作

一、导入jar包 见 http://pan.baidu.com/s/1dE9kMJZ 二、导入c3p0并修改值 c3p0.driverClasscom.mysql.jdbc.Driver c3p0.jdbcUrljdbc:mysql://localhost:3306/store c3p0.userroot c3p0.password123456 三、导入工具类 见 http://pan.baidu.com/s/1miutJXe 有关这些工具类的分…

java配合ajax加快发展_配合JAVA的AJAX使用

概要Ajax是“Asynchronous JavaScript and XML”的简称,即异步的JavaScript和XML。readyState属性用来返回当前的请求状态,有五个可选值。分别是0到4,每个值的含义如下描述。 0:“未初始化”状态, 表示已经创建一个XML…

你以为美国商业航天那么牛只是因为马斯克?更多原因在这里!

来源:银河航天漫游指南2020年5月31日,SpaceX的载人龙飞船成功将两位宇航员成功送往国际空间站,成为有史以来第一家将人类送入太空轨道的私营企业。美国商业航天领域的进展有目共睹。载人龙飞船起飞瞬间这次成功发射打破了传统航天领域以国家力…