多线程事务并发在生活中见到的列子很多 比如网上购票 双11购物这些 都会用到事务来进行处理
那多线程事务是以什么样的顺序来执行昵?是不是很好奇昵?
接下来我来讲解哈这个问题
首先这里演示的就是winform 窗体:
现在我们看到有两个按钮,在我们点击button1以后并马上点击button2以后会是一个什么样的结果:
首先来看看两个按钮都有哪些事件:
Task task = new Task(() => { //调用方法(sql语句,时间) UserDAL.trantion("update Users set Number='001' where id=1", 5000); }); //开启线程 task.Start();
源码截图(仅供参考):
调用的方法是什么昵?
请看下面:
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) { } } }
源码截图(仅供参考):
现在我们就要来思考了:
当我们点击button1然后点击button2数据库修改 id=1,Number的字段是001,还是002,
分析:
当我们点击button1之后执行button1事务,这个事务要间隔5秒以后才保存,
然而这时候我们又点击了button2这个按钮触发了button2这个事务,这个事务没有间隔时间直接执行以后保存。
这哈就想到button1需要间隔5秒保存,是不是button2执行完成以后时间就差不多5秒,最后保存的是不是应该就是button1昵?Numbe=001
这个时候我们一起来看看结果,我们是否分析的是不是正确的昵?
看到这个结果就能知道分析错了,并不是Numbe=001
确定分析:
首先我们要知道什么是事务:事务是一个整体,不可以细分
当我们执行一个事务,要让这个事务执行完成以后才去执行另外一个事务
我们这里也是一样的,当点击button1以后就要让button1中的事务处理完成以后,才能执行下面的事务。
就算是点击了很多button2,或者button3,都要排序,等button1执行完成后,执行button2,在去执行button3中的事务,所以最后结果才是Numbe=002
当在执行事务中,不能进行其他操作,执行事务时:数据会被锁住(一般的查询语句,都会出现下图):
所有Select加 With (NoLock)解决阻塞死锁
select * from Users With (NoLock)
事务多线程的就讲解到这里,有问题欢迎下方留言一起共同探讨!