用的是mysql引擎是InnoDB,用到了连接池。
连接还没关闭,但是事务开启,并执行了更新id=14的操作,这是把这一行锁住了,可以查询,但不能更新和删除,必需等锁释放,提交换回滚事务时锁被释放。直接关闭连接锁也会被释放,但是该连接上的事务还存在,所以下面重新打开连接,然后提交事务,但是此时提交事务只是释放该连接的事务,并不会执行上面的更新操作。(ps:第二次打开连接,但是连接的con.ServerThread并不是一样的,上面的是44,下面的是45.但是提交事务没出错,所以应该是同一个。下面做验证。)
第二次重新实例化一个连接,提交事务时异常了且con.ServerThread也是不一样的,所以证明上面的第二次打开连接是同一个。
如果要重新开启事务,需要重新得到一个事务。不然是不起作用的,可以试着把红线旁边的代码注释,然后单步调试,看数据库的数据变化。
C#代码。
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 string sql = "update Nc_A set name='gfeng1' where id=14"; 5 MySqlCommand com = new MySqlCommand(sql, con); 6 MySqlTransaction tran = con.BeginTransaction(); 7 8 int rowcount = com.ExecuteNonQuery(); 9 //con.Close(); 10 //con.Dispose(); 11 //tran.Commit(); 12 //tran.Rollback(); 13 con.Close(); 14 //con.Dispose(); 15 //con = new MySqlConnection(connString); 16 con.Open(); 17 tran = con.BeginTransaction(); 18 //tran = con.BeginTransaction(); 19 rowcount = com.ExecuteNonQuery(); 20 tran.Commit(); 21 //tran.Commit(); 22 con.Close();