mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置

0、准备
事务隔离级别如下:
Read-Uncommitted
Read-Committed
Repeatable-Read
Seriaizable
在xhsell开启三个会话( 注意:这里的xshell会话和数据库会话做区分;事务基于数据库连接,我们将一个数据库会话看作一个事务):session A、session B、session C
先在sessionA下连接数据库,session B、session C暂时不连
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第1张图片

1、事务隔离级别的查看
5.7.2之前 使用 show variables like 'tx_isolation' 或者 select @@tx_isolation;
5.7.2之后 使用 show variables like 'transaction_isolation'或者 select @@transaction_isolation;
2、事务隔离级别的修改
5.7.2之前 使用 set [global 全局范围 /session 会话范围 ] tx_isolation = ‘隔离级别’
5.7.2之后 使用 set [global 全局范围 /session 会话范围 ] transaction_isolation = ‘隔离级别’
之前全局范围和会话范围理解有偏差,这次纠正操作一下
全局范围:对当前****存在的会话无效,对之后连接的所有会话有效
会话范围:对当前会话的后续的事务有效,对之前的事务无效;如果在事务之间执行,对后续的事务有效;如果在已经开启的事务中间执行,不会影响当前正在执行的事务
全局范围和会话范围都是基于内存的,重启mysql之后又会回到默认的隔离级别

实践如下:
先验证global 全局范围的使用
1、查看数据库的默认隔离级别 (由于我的mysql version是 <5.7 ,应该使用show variables like 'tx_isolation'; ),并修改隔离级别的有效范围为全局范围(set global tx_isolation = 'READ-COMMITTED';)
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第2张图片
按照前面的理论那么我们可以得到
思考1:设置了global的有效范围,当前会话查看应该仍然是 repeatable-read;
思考2: 在sessionB连接后再查看应该就变成 read-committed了

验证1:
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第3张图片

验证2:
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第4张图片
思考3:sessionA、B 已经连接后再sessionA设置,那么对B还会有效吗?
因为我们之前说过global对于当前存在的会话是不会生效的,之后新的会话才有效;所以这里预计
sessionB仍然是read-committed,最后再重新加入一个sessionC查看隔离级别应该变成了Read-Uncommitted
实践:在session A中再设置 global范围为Read-Uncommitted级别(set global tx_isolation = 'Read-Uncommitted';),再观察sessionB是否生效,最后再重新加入一个sessionC观察结果
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第5张图片
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第6张图片
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第7张图片
根据结果,上面的思考预期是正确的,我们的理论也是得到了验证;重启数据库可以自己验证

接下来验证隔离级别为会话范围
自然应该我们在哪个session中设置,哪个session中生效
在sessionA中设置serializable, A生效,B、C不生效
sessionA serializable
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第8张图片
sessionB
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第9张图片
sessionC
mysql数据库事务隔离级别的查看、设置、以及隔离级别有效范围的设置_第10张图片
session范围得到了验证.

你可能感兴趣的:(数据库,mysql,服务器)