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

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

  • 相关阅读:
    HDU 5912 Fraction (模拟)
    CodeForces 722C Destroying Array (并查集)
    CodeForces 722B Verse Pattern (水题)
    CodeForces 722A Broken Clock (水题)
    CodeForces 723D Lakes in Berland (dfs搜索)
    CodeForces 723C Polycarp at the Radio (题意题+暴力)
    CodeForces 723B Text Document Analysis (水题模拟)
    CodeForces 723A The New Year: Meeting Friends (水题)
    hdu 1258
    hdu 2266 dfs+1258
  • 原文地址:https://www.cnblogs.com/tpfOfBlog/p/6238009.html
Copyright © 2011-2022 走看看