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();
C# Code

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
sql Code

表结构

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;

原文地址:https://www.cnblogs.com/tpfOfBlog/p/6249687.html