c#连接关闭了,事务并没有关闭
用的是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();
sql代码
1 select * 2 from nc_a 3 where Id=14 4 5 DELETE FROM nc_a WHERE Id=15 6 7 UPDATE nc_a SET `name`='gfeng20' WHERE Id=14 8 9 UPDATE nc_a 10 SET `name`=CONCAT(`name`,'1') 11 WHERE id=14
表结构
1 CREATE TABLE `nc_a` ( 2 `Id` int(10) unsigned NOT NULL AUTO_INCREMENT, 3 `name` varchar(250) DEFAULT NULL, 4 `phone` varchar(11) DEFAULT NULL, 5 `address` varchar(50) DEFAULT NULL, 6 PRIMARY KEY (`Id`) 7 ) ENGINE=InnoDB AUTO_INCREMENT=679069 DEFAULT CHARSET=latin1;
连接mysql需要MySql.Data.dll;mysql查看连接数的命令是show processlist;