我有一个MySql 5.6.44,以及一个使用Mysql.Data 8.0.12的dotnet应用程序。
应用程序代码到目前为止还没有指定任何隔离级别,因为默认的隔离级别已经足够了。突然间,我们需要在一个新特性中执行SERIALIZABLE事务,并且只有代码的这一部分中的事务指定这样的级别。
在dotnet中,到DB的连接是池的,所以在连接使用结束后,连接返回到池。我担心的是,为该操作设置的隔离级别仍然在影响代码中不需要如此高级别的其他事务的连接中。
根据组件文档,有一个可选的连接字符串参数,该参数指示是否需要重置连接状态:
ConnectionReset,连接重置默认值: false如果为真,则在从池中检索连接状态时重置连接状态。false的默认值可以避免在获得连接时进行额外的服务器往返,但是连接状态不会被重置。
通过检查反编译的组件代码,事务级别似乎是使用会话范围(MySqlConnection.cs:1238)设置的:
MySqlTransaction mySqlTransaction = new MySqlTransaction(this, iso);
MySqlCommand mySqlCommand = new MySqlCommand("", this);
mySqlCommand.CommandText = "SET SESSION TRANSACTION ISOLATION LEVEL ";
switch (iso)
{
case System.Data.IsolationLevel.Chaos:
this.Throw((Exception) new NotSupportedException(Resources.ChaosNotSu
break;
case System.Data.IsolationLevel.ReadUncommitted:
mySqlCommand.CommandText += "READ UNCOMMITTED";
break;
...根据关于事务的MySql文档的说法:
使用session关键字:该语句适用于在当前会话中执行的所有后续事务。
因此,如果我正确理解,为一个操作设置的隔离级别将影响我们代码中没有指定隔离级别本身的其他操作,因为连接是在没有重新设置的情况下返回到池中的。
既然如此,我应该在连接字符串中使用"ConnectionReset“参数,对吗?
PS:开源MySql连接器 (我们不使用)似乎是设置true默认情况下,在ConnectionReset参数默认情况下,这对我来说完全有意义。
发布于 2020-02-01 22:13:31
以下可能允许您对应用程序使用任何隔离模式:
BEGIN;
SELECT ... FOR UPDATE; -- necessary if about to change a row
...
UPDATE ...;
UPDATE ...;
COMMIT;https://dba.stackexchange.com/questions/258252
复制相似问题