>
多线程事务并发以什么样的顺序来执行昵?
2020-11-10 17:56
Winform
  • 2015
  • 527
  • 64
  • 51

多线程事务并发在生活中见到的列子很多 比如网上购票 双11购物这些 都会用到事务来进行处理

多线程事务是以什么样的顺序来执行昵?是不是很好奇昵?

接下来我来讲解哈这个问题

首先这里演示的就是winform 窗体:

aeb38a95-ff11-4cae-b5a9-94ca4adfd57d.png

现在我们看到有两个按钮,在我们点击button1以后并马上点击button2以后会是一个什么样的结果:

首先来看看两个按钮都有哪些事件:

     

 Task task = new Task(() =>           
         {
                //调用方法(sql语句,时间)
                 UserDAL.trantion("update  Users set Number='001' where id=1", 5000);
            });
            //开启线程
            task.Start();


源码截图(仅供参考):

6f7c4245-589d-4812-b1cf-52dddfbda9d3.png

调用的方法是什么昵?

请看下面:

public static void trantion(string sql, int timespan)
       {
           //数据库连接
           using(SqlConnection conn=new SqlConnection("server=.;uid=sa;pwd=123456;database=oa"))
           {
               //打开数据库连接
               conn.Open();
               //开始数据库事物
               SqlTransaction trans = conn.BeginTransaction();
               try
               {
                   SqlCommand com = new SqlCommand(sql,conn,trans);
                   //执行事件
                   int count=com.ExecuteNonQuery();
                   //间隔时间
                   System.Threading.Thread.Sleep(timespan);
                   //保存
                   trans.Commit();
               }
               catch(Exception ex)
               {
               
               }
           }
       }


源码截图(仅供参考):

d9c9faf7-ab61-4cb6-9c32-d3af9d010673.png

现在我们就要来思考了:

当我们点击button1然后点击button2数据库修改 id=1,Number的字段是001,还是002,

分析:

当我们点击button1之后执行button1事务,这个事务要间隔5秒以后才保存,

然而这时候我们又点击了button2这个按钮触发了button2这个事务,这个事务没有间隔时间直接执行以后保存。

这哈就想到button1需要间隔5秒保存,是不是button2执行完成以后时间就差不多5秒,最后保存的是不是应该就是button1昵?Numbe=001

这个时候我们一起来看看结果,我们是否分析的是不是正确的昵?

59d3879e-aa3d-4d9a-b111-2141fbcc785f.png


看到这个结果就能知道分析错了,并不是Numbe=001

确定分析:

首先我们要知道什么是事务:事务是一个整体,不可以细分

当我们执行一个事务,要让这个事务执行完成以后才去执行另外一个事务

我们这里也是一样的,当点击button1以后就要让button1中的事务处理完成以后,才能执行下面的事务。

就算是点击了很多button2,或者button3,都要排序,等button1执行完成后,执行button2,在去执行button3中的事务,所以最后结果才是Numbe=002

当在执行事务中,不能进行其他操作,执行事务时:数据会被锁住(一般的查询语句,都会出现下图):

c9ec6bd7-8612-40d4-a144-9ff0e7fe23eb.png


所有Select加 With (NoLock)解决阻塞死锁

select * from Users With (NoLock)

事务多线程的就讲解到这里,有问题欢迎下方留言一起共同探讨!



全部留言 ()
返回
顶部