澳门至尊网站-首页

您的位置:澳门至尊网站 > 黑客安全 > 深究逻辑事务

深究逻辑事务

2019-10-25 02:24

一、什么是TransactionScope?

  TransactionScope即范围事务(近似数据库中的事务),保证专门的工作申明范围内的整个数据改良操作情状风度翩翩致性,要么全体打响,要么全体诉讼失败回滚.

  MSDN:即便在事情限定内未不发生其余万分 (即之间的初始化 TransactionScope 对象并调用其 Dispose 方法),则范围所参加的作业能够持续,不然参加到里面包车型大巴业务将回滚。
      当应用程序实现全数专业时它想要在业务中实施,应调用 Complete 方法三回,以文告该事情管理器是可承当(此时职业并未提交),就可以提交业务,没能调用此办法中止事务。
      调用 Dispose 方法将符号事务节制的尾声。 在调用此形式之后所发出的可怜不会影响专门的学问。

二、TransactionScope有怎么样用?

  假若现在有一个需求:达成四个下单成效,首要业务包蕴扣减商品仓库储存、扣减客户账户余额、生成订单记录以致记录日志。为了保险数据风华正茂致性我们平常的做法正是在数据库建多少个下订单的事体,然后程序调用事务传入相应的参数就能够。那么难题来了,若是客户的账户数量跟订单数量分别处于不一样的数据库,就万般无奈在同一个数据库事务里造成有着职责,也就没办法保险数据的生龙活虎致性。
  这几天由于专门的学问的校勘公司改用MySQL数据库,管理多少更换时习于旧贯性先写作业,写的时候开采现成数据库中三个业务都不曾,于是去问java组,不采纳工作怎么保障数据的黄金时代致性?获得的答复是:事务是何许鬼,spring帮我们减轻所反常...。立马就懵逼了,.net中没听他们讲有Spring啊(听新闻说有临近的框架),固然能够杜撰使用仓库储存加专门的学业单元来缓慢解决,不过感觉好费力的指南,后来寻觅技术方案时开采了TransactionScope。

三、TransactionScope怎么利用?

 1 try
 2 {
 3     using (TransactionScope scope = new TransactionScope())
 4     {
 5         //TODO:数据处理业务       
 6         scope.Complete();
 7     }
 8 }
 9 catch (Exception ex)
10 {
11     throw ex;
12 }

四、问题研究

1、准备工作

 1 //数据库访问对象
 2 public class Studuent
 3 {
 4     public static IList<StudentModel> GetList()
 5     {
 6         //不允许脏读
 7         string sql = "SELECT Id,Name,CreateTime FROM Student ORDER BY Id DESC;";
 8         DataTable dt = SQLHelper.ExecuteDataTable(CommandType.Text, sql);
 9         return dt.ToModel<StudentModel>();
10     }
11 
12     public static bool Add(string name)
13     {
14         SqlParameter[] parms = { new SqlParameter("@Name", SqlDbType.NVarChar, 32) { Value = name } };
15         string sql = "INSERT INTO Student (Name) VALUES (@Name)";
16         return SQLHelper.ExecuteNonQuery(CommandType.Text, sql, parms) > 0;
17     }
18 
19     public static void Clear()
20     {
21         SQLHelper.ExecuteNonQuery("DELETE Student");
22     }
23 }

 1 //公共方法,输出学生列表
 2 static void PrintStudent()
 3 {
 4     IList<StudentModel> list = Studuent.GetList();
 5     foreach (var item in list)
 6     {
 7         Console.WriteLine("{0}t{1}t{2}", Thread.CurrentThread.ManagedThreadId, item.Name, item.CreateTime);
 8     }
 9     Console.WriteLine();
10 }

2、事务哪天提交? 图片 1

最先小编认为在实践Complete后立时提交,但依靠输出结果能够见见,Complete方法实践两秒之后事务仍然未有付诸。因为不容许脏读的原故,主线程会在事情对Student表操作完毕后才可查询完成,但学生列表是在scope调用dispose方法之后输出,MSDN介绍说dispose明确职业节制末尾,由此估量事务是在调用dispose时被交给。

3、极度是怎么导致数据不被交付?

图片 2

图片 3

看待两幅图可以看见,格外在Complete之后产生并不会影响专业的交付,事务未提交是因为发生非常导致Complete未被执行。以前看过生龙活虎篇文章说,要是TransactionScope范围中向来不调用Complete会导致程序极其,小编想她必定是开玩笑的...

4、嵌套事务

图片 4

图片 5

 

本文由澳门至尊网站发布于黑客安全,转载请注明出处:深究逻辑事务

关键词: