zoukankan      html  css  js  c++  java
  • 并行事务同时更新同一条记录

    程序大概代码。

    sql语句

    首先调试程序,等程序断下来之后,在浏览器重新发起一次请求,模拟双线程。这时调试窗口有线程(ps:这里用到的是mysql自带的连接池)

     事务开始但还没更新该记录时,该行还未被锁定,这是还可以更新

    这时6号线程下一步就执行更新操作了

    6号线程执行完之后,由于事务ID为14的记录被锁定,可以看到已经不能修改了,在排队等待事务关闭,如果等待过久直接取消这次操作

    这时8号线程也在执行更新ID为14的操作,但是由于上一个事务未关闭,导致被锁,在排队等待。

    可以看到mysql取消操作了。

    已经异常了,而且连接已经关闭了

    这时手动释放事务,由于是连接池,调用Close()并不是真正关闭连接只是放回连接池。所以要释放事务,不然下次获得该连接时会出错。而且还会导致死锁。

    最后,总结并行事务第一个事务会锁住更新的记录,下一个事务操作(更新或删除)该记录时排队等待上一个事务释放锁,如果等待过长会取消操作,并且抛出异常,捕获异常进行相应的操作回滚事务或关闭连接释放锁,不然会导致死锁。并且上一个事务提交之后,下一个事务的回滚不会影响到上一个事务的操作。

     1 string connString = "Server=localhost;Database=test;Uid=root;Pwd=root;Charset=utf8;pooling=true;Min Pool Size=2;Max Pool Size=20;";
     2             MySqlConnection con = new MySqlConnection(connString);
     3             con.Open();
     4             Random r = new Random();
     5             int n = r.Next(100);
     6            
     7             string sql = "update Nc_A set name='gfeng"+n.ToString()+"' where id=14";
     8             MySqlCommand com = new MySqlCommand(sql, con);
     9             MySqlTransaction tran = con.BeginTransaction();
    10             try
    11             {
    12                 int rowcount = com.ExecuteNonQuery();
    13                 int k = 0;
    14                 int jk = 0;
    15                 int jk2 = 0;
    16                 if (HttpContext.Cache["n"] == null)
    17                 {
    18                     tran.Commit();
    19                     HttpContext.Cache["n"] = n;
    20                 }
    21                 else
    22                 {
    23                     tran.Rollback();
    24                 }
    25 
    26                 con.Close();
    27             }
    28             catch
    29             {
    30                 con.Close();
    31             }
    View Code

    当然不是更新同一条记录是各不影响的。主要还是要理解锁和事务的机制(之间是有区别的,用事务比用锁性能要低,毕竟要悬挂事务用于回滚或提交)。

  • 相关阅读:
    Coding4Fun.Phone.Controls的使用
    发布windows phone应用经历实谈
    我的第一款windows phone软件
    华农js抢课神器
    zookeeper 实战案例分享:cruator客户端编程
    zookeeper学习与实战(二)集群部署
    zookeeper学习与实战(一)环境部署
    Flask框架的学习与实战(三):登陆管理
    Flask框架的学习与实战(二):实战小项目
    Flask框架的学习与实战(一):开发环境搭建
  • 原文地址:https://www.cnblogs.com/tpfOfBlog/p/6238009.html
Copyright © 2011-2022 走看看