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月…

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

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

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产业泡沫破灭,作为通信设备商,华为也受累进入寒冬,任正非为了鼓励团队士气,写出了著…

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

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

昨夜,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 有关这些工具类的分…

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

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

java游戏应龙女魃转世_应龙和女魃的凄美爱情,究竟是爱情,还是阴谋?

人世间最痛苦的事情是什么?有人说是生老病死,也有人说是爱憎别离。对于她来说,或许最痛苦的是他的欺骗与背叛……女魃一、初见北荒往东二百里,有一座山,名唤玲珑山。山中住着一名神女,名为女魃。相传&#…

热点|因为AI不是人,美国专利局拒绝认定TA的所有发明权

来源:量子位「你不是人!」——美国专利局(USPTO)。这句话是美国专利局,对所有人工智能说的。4月27日,美国专利局出台一项规定:对于任何由人工智能独立设计发明的产品,因为AI不是自然…

登陆界面代码

1、设计思想 添加窗口界面,想i面添加一系列组件。 输入账号密码和验证码后,如果验证码正确,进行注册,否则注册失败。注册成功后,验证码自动刷新,并将注册的帐号和密码保存。注册失败后,验证码刷…

为何苹果为何苹果甘愿冒险自主研发芯片?

来源:内容来自「腾讯科技」7月4日,据外媒报道,苹果不久前宣布将把Mac上使用的处理器从英特尔芯片迁移到自己的Apple Silicon上,尽管这是意料之中的事,但苹果为何甘愿冒险甚至似乎相当渴望进行这种转型的,仍…

用MXNet实现mnist的生成对抗网络(GAN)

用MXNet实现mnist的生成对抗网络(GAN) 生成式对抗网络(Generative Adversarial Network,简称GAN)由一个生成网络与一个判别网络组成。生成网络从潜在空间(latent space)中随机采样作为输入,其输出结果需要尽…

java单元格合并多列_ElementUI表格列相同值自动合并单元格( 多列 )

上篇文章写了如何在处理单列相同数据时让相同的项进行自动合并, 如果有多列合并的需求我们也应该可以从容应对...(产品: 你们看我干嘛?)废话不多说 上代码HTMLJSvar Main {data() {return {tableData6: [{name: 部门1,type: 0,amount1: 跟单员1,amount2: 成衣工厂1,amount3: …

【MIT港科大】最新《贝叶斯深度学习》2020综述论文,35页pdf全面阐述最新进展...

来源:专知来自MIT和香港科技大学的学者最新《贝叶斯深度学习》综述论文,值得关注!地址:https://www.zhuanzhi.ai/paper/9b781282204cb581a31aa0e8b570dd95摘要一个综合的人工智能系统不仅需要用不同的感官(如视觉和听觉)感知环境&…