赞
踩
0、准备
事务隔离级别如下:
Read-Uncommitted
Read-Committed
Repeatable-Read
Seriaizable
在xhsell开启三个会话( 注意:这里的xshell会话和数据库会话做区分;事务基于数据库连接,我们将一个数据库会话看作一个事务):session A、session B、session C
先在sessionA下连接数据库,session B、session C暂时不连
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';
)
按照前面的理论那么我们可以得到
思考1:设置了global的有效范围,当前会话查看应该仍然是 repeatable-read;
思考2: 在sessionB连接后再查看应该就变成 read-committed了
验证1:
验证2:
思考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观察结果
根据结果,上面的思考预期是正确的,我们的理论也是得到了验证;重启数据库可以自己验证
接下来验证隔离级别为会话范围
自然应该我们在哪个session中设置,哪个session中生效
在sessionA中设置serializable, A生效,B、C不生效
sessionA serializable
sessionB
sessionC
session范围得到了验证.
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。