认识LTE(七):LTE中的两种无反馈模式:发射分集(TM2)和开环空分复用(TM3)

article/2025/9/28 9:31:15

认识LTE(七):LTE中的两种无反馈模式:发射分集(TM2)和开环空分复用(TM3)

文章目录

  • 认识LTE(七):LTE中的两种无反馈模式:发射分集(TM2)和开环空分复用(TM3)
  • 零.代码地址
  • 一.LTE中MIMO的一些基本概念
  • 二.TM2:发射分集
    • 1. 原理
    • 2.全流程
  • 三.TM3:开环空间复用
    • 1.原理
    • 2.全流程

零.代码地址

https://github.com/liu-zongxi/LTE_simulation

请大家看完觉得有用别忘了点赞收藏,github项目给star哦

一.LTE中MIMO的一些基本概念

在介绍这两种模式之前,我们要大致说一下MIMO的一些基本概念

  1. LTE的MIMO包括两个步骤,层映射和预编码,所谓层映射,是指把数据流映射到多个层,MIMO中就可以按层数发送,预编码则是MIMO的手段。分集使用SFBC,二MIMO则是用于减小计算量的SVD
  2. 层,什么是层呢?

image-20220811142035461

  1. 层数怎么来确定呢?这涉及到两方面,一个是发射天线和接收天线数,层数和Rank相关,二是要确保要满秩,满秩就要环境足够复杂
  2. 流:这被称为CodeWord,非常迷惑人的一个称呼,他表示的实际上是有几个数据流
  3. Rank:这会被再CSI中用RI参数来反馈矩阵的秩的大小
  4. 层映射,把流映射到层、

image-20220811143352890

二.TM2:发射分集

1. 原理

[外链图片转存失败,源站可能有防盗链机制,建议将图片保存下来直接上传(img-MXuaYMzQ-1660205620527)(http://images.lzxixi.ltd/image-20220811143519619.png)]

开局一张图

在之前的博客中,我详细的写过STBC的原理和实现,大家可以去翻看一下

那么SFBC有什么区别呢,答案是没什么区别,只是把其中一个进行了一个符号的变换

image-20220811144256689

有趣的是,在TM2中,四天线和二天线本质上是一致的,哪怕是八天线,其实还是二天线

image-20220811144423435

function out = TDEncode(in, numTx)
%   Both SFBC and SFBC with FSTD
persistent hTDEnc;
if isempty(hTDEnc)% Use same object for either schemehTDEnc = comm.OSTBCEncoder('NumTransmitAntennas', 2);
end
switch numTxcase 1out=in;case 2 % SFBC% 为了公用Alamouti的代码,把第二个符号取负共轭in((2:2:end).') = -conj(in((2:2:end).'));% STBC Alamoutiy= step(hTDEnc, in);       % Scaleout = y/sqrt(2);case 4inLen=size(in,1);y = complex(zeros(inLen, 4));% 同样的操作,STBC到SFBC的转换in((2:2:end).') = -conj(in((2:2:end).'));% 取出一二两根天线,然后又是使用matlab的特性把他们两交织在一起% 这个在之前插值中已经使用过此技巧了% idx12的序列是1 2 5 6 9 10...% 这最终会被映射到13天线idx12 = ([1:4:inLen; 2:4:inLen]); idx12 = idx12(:);% 34天线% 映射到24天线idx34 = ([3:4:inLen; 4:4:inLen]); idx34 = idx34(:);% 进行STBCy(idx12, [1 3]) = step(hTDEnc, in(idx12));y(idx34, [2 4]) = step(hTDEnc, in(idx34));out = y/sqrt(2);
end
function y = TDCombine(in, chEst, numTx, numRx)
% LTE transmit diversity combining
%   SFBC and SFBC with FSTD.
persistent hTDDec;
% 为什么只设置2*2的呢,因为即使是4天线也是两个2天线组成的
% 接收具体是如何实现的呢
% function s = Alamouti_Combiner1(u,H)
% %#codegen
% % STBC_DEC STBC Combiner
% % Outputs the recovered symbol vector
% LEN=size(u,1);
% Nr=size(u,2);
% BlkSize=2;
% % 2个为一组
% NoBlks=LEN/BlkSize;
% % Initialize outputs
% h=complex(zeros(1,2));
% s=complex(zeros(LEN,1));
% % Alamouti code for 2 Tx
% indexU=(1:BlkSize);
% for m=1:NoBlks
% t_hat=complex(zeros(BlkSize,1));
% h_norm=0.0;
% % 一个天线一个天线来接受
% for n=1:Nr
% % 一次使用两个时间的即h1和h2
% h(:)=H(2*m-1,:,n);
% % 代表着能量
% h_norm=h_norm+real(h*h');
% r=u(indexU,n);
% r(2)=conj(r(2));
% % 分子
% shat=[conj(h(1)), h(2); conj(h(2)), -h(1)]*r;
% t_hat=t_hat+shat;
% end
% s(indexU)=t_hat/h_norm; % Maximum-likelihood combining
% indexU=indexU+BlkSize;
% end
% end
if isempty(hTDDec)% OSTBC combiner - always numTx = 2hTDDec = comm.OSTBCCombiner('NumTransmitAntennas', 2, ...'NumReceiveAntennas', numRx);
end
inLen = size(in, 1);
Index=(2:2:inLen)';
switch numTxcase 1y=in;case 2   % For 2TX - SFBC% 恢复本来大小in = sqrt(2) * in; % Scaley = step(hTDDec, in,chEst);% ST to SF transformation.% Apply blockwise correction for 2nd symbol combining% 恢复成SFBCy(Index) = -conj(y(Index));case 4   % For 4Tx - SFBC with FSTDin = sqrt(2) * in; % ScaleH = complex(zeros(inLen, 2, numRx));idx12 = ([1:4:inLen; 2:4:inLen]); idx12 = idx12(:);idx34 = ([3:4:inLen; 4:4:inLen]); idx34 = idx34(:);% 找到对应的信道H(idx12, :, :) = chEst(idx12, [1 3], :);H(idx34, :, :) = chEst(idx34, [2 4], :);y = step(hTDDec, in, H);% ST to SF transformation.% Apply blockwise correction for 2nd symbol combining% 恢复成SFBCy(Index) = -conj(y(Index));
end

2.全流程

function [dataIn, dataOut, txSig, rxSig, dataRx, yRec, csr_ref]...= commlteMIMO_TD_step(nS, snrdB, prmLTEDLSCH, prmLTEPDSCH, prmMdl)
%% TX
%  Generate payload
% 生成数据
dataIn = genPayload(nS,  prmLTEDLSCH.TBLenVec);
% 添加CRC
% Transport block CRC generation
tbCrcOut1 =CRCgenerator(dataIn);
% Channel coding includes - CB segmentation, turbo coding, rate matching,
% bit selection, CB concatenation - per codeword
[data, Kplus1, C1] = lteTbChannelCoding(tbCrcOut1, nS, prmLTEDLSCH, prmLTEPDSCH);
%Scramble codeword
scramOut = lteScramble(data, nS, 0, prmLTEPDSCH.maxG);
% Modulate
modOut = Modulator(scramOut, prmLTEPDSCH.modType);
% TD with SFBC
numTx=prmLTEPDSCH.numTx;
alamouti = TDEncode(modOut(:,1),numTx);
% Generate Cell-Specific Reference (CSR) signals
% CSR的处理
csr = CSRgenerator(nS, numTx);
csr_ref=complex(zeros(2*prmLTEPDSCH.Nrb, 4, numTx));
for m=1:numTxcsr_pre=csr(1:2*prmLTEPDSCH.Nrb,:,:,m);csr_ref(:,:,m)=reshape(csr_pre,2*prmLTEPDSCH.Nrb,4);
end
% Resource grid filling
txGrid = REmapper_mTx(alamouti, csr_ref, nS, prmLTEPDSCH);
% OFDM transmitter
txSig = OFDMTx(txGrid, prmLTEPDSCH);
%% Channel
% MIMO Fading channel
[rxFade, chPathG] = MIMOFadingChan(txSig, prmLTEPDSCH, prmMdl);
% Add AWG noise
nVar = 10.^(0.1.*(-snrdB));
rxSig =  AWGNChannel(rxFade, nVar);
%% RX
% OFDM Rx
rxGrid = OFDMRx(rxSig, prmLTEPDSCH);
% updated for numLayers -> numTx
[dataRx, csrRx, idx_data] = REdemapper_mTx(rxGrid, nS, prmLTEPDSCH);
% MIMO channel estimation
if prmMdl.chEstOnchEst = ChanEstimate_mTx(prmLTEPDSCH, csrRx,  csr_ref, prmMdl.chEstOn);hD     = ExtChResponse(chEst, idx_data, prmLTEPDSCH);
elseidealChEst = IdChEst(prmLTEPDSCH, prmMdl, chPathG);hD =  ExtChResponse(idealChEst, idx_data, prmLTEPDSCH);
end
% Frequency-domain equalizer
if (numTx==1)% Based on Maximum-Combining Ratio (MCR)yRec = Equalizer_simo(dataRx, hD, nVar, prmLTEPDSCH.Eqmode);
else% Based on Transmit Diversity  with SFBC combineryRec = TDCombine(dataRx, hD, prmLTEPDSCH.numTx, prmLTEPDSCH.numRx);
end
% Demodulate
demodOut = DemodulatorSoft(yRec, prmLTEPDSCH.modType, nVar);
% Descramble received codeword
rxCW =  lteDescramble(demodOut, nS, 0, prmLTEPDSCH.maxG);
% Channel decoding includes - CB segmentation, turbo decoding, rate dematching
[decTbData1, ~,~] = lteTbChannelDecoding(nS, rxCW, Kplus1, C1,  prmLTEDLSCH, prmLTEPDSCH);
% Transport block CRC detection
[dataOut, ~] = CRCdetector(decTbData1);
end

我们可以看到,在TM2中,层映射和预编码是在一步完成的,SFBC自然而然的把输出序列变为了两列,是非常巧妙的!其他的和SISO没有太大的变化

三.TM3:开环空间复用

1.原理

既然是MIMO了,首先我们先来讲一下预编码,理想的预编码是SVD,这是最好的,但很遗憾,这要求反馈信道,这是做不到的

因此LTE使用了码本,开环选用固定的码本,而闭环的会变化,这就是区别

image-20220811151531550

image-20220811151547232

主要注意,在TM3中,不仅仅有码本W,还有CCD,循环延时分集的操作,这是书中没有提到的,具体可以看https://zhuanlan.zhihu.com/p/495045923,把两天线的情况说的比较清晰了

image-20220811152115384

image-20220811152126559

function out = LayerMapper(in1, in2, prmLTEPDSCH)
% LTE Layer mapper for spatial multiplexing.
%
%   Assumes two codeword input for spatial multiplexing.
%   As per TS 36.211 v10.0.0, Section 6.3.3.2.%   Copyright 2012 The MathWorks, Inc.%#codegen
% Assumes the incoming codewords are of the same length.
% 参数获取
q = prmLTEPDSCH.numCodeWords;           % Number of codewords
v = prmLTEPDSCH.numLayers;                   % Number of layers
% 两个数据流,TM3总是支持双流的,而现在考虑的是满秩情况
inLen1 = size(in1, 1);
inLen2 = size(in2, 1);
% 根据数据流分类
switch q% 如果是单流,那直接根据层数分列就可以了case 1  % Single codeword% for numLayers = 1,2,3,4out = reshape(in1, [], v);% 双流的情况case 2  % Two codewordsswitch v% 两层case 2% 双流双层,分别对应即可out = complex(zeros(inLen1, v));out(:,1) = in1(:,1);out(:,2) = in2(:,1);case 3 % => different length input codewordsassert(false, '3 layers for 2 codewords is not implemented yet.');case 4% 双流四层% 一个流则对应两个层out = complex(zeros(inLen1/2, v));out(:,1:2) = reshape(in1, 2, inLen1/2).';out(:,3:4) = reshape(in2, 2, inLen2/2).';case 5 % => different length input codewordsassert(false, '5 layers for 2 codewords is not implemented yet.');case 6% 双流六层% 一个流对应三个层out = complex(zeros(inLen1/3, v));out(:,1:3) = reshape(in1, 3, inLen1/3).';out(:,4:6) = reshape(in2, 3, inLen2/3).';case 7 % => different length input codewordsassert(false, '7 layers for 2 codewords is not implemented yet.');case 8% 双流八层out = complex(zeros(inLen1/4, v));out(:,1:4) = reshape(in1, 4, inLen1/4).';out(:,5:8) = reshape(in2, 4, inLen2/4).';end
end% [EOF]
function [out1, out2] = LayerDemapper(in, prmLTEPDSCH)
% LTE Layer demapper for spatial multiplexing.
%
%   Assumes two codeword input for spatial multiplexing.
%   Based on TS 36.211 v10.0.0, Section 6.3.3.2.%   Copyright 2012 The MathWorks, Inc.%#codegen
%   Assumes the incoming codewords are of the same length. Assumes the
%   input signal is oriented similarly as the output of the layer mapper.q = prmLTEPDSCH.numCodeWords;       % Number of codewords
v = size(in, 2);                    % Number of layers
% 注意,这不是单纯的反过来,还是把数据映射到数据流,但要根据层来
switch qcase 1  % Single codewordout1 = in(:);out2 = out1; % dummycase 2  % Two codewordsswitch vcase 2out1 = in(:,1);out2 = in(:,2);case 4temp = in(:,1:2).';out1 = temp(:);temp = in(:,3:4).';out2 = temp(:);case 6temp = in(:,1:3).';out1 = temp(:);temp = in(:,4:6).';out2 = temp(:);case 8temp = in(:,1:4).';out1 = temp(:);temp = in(:,5:8).';out2 = temp(:);otherwiseout1 = in;out2 = in;endotherwiseout1 = in;out2 = in;
end
function out = SpatialMuxPrecoderOpenLoop(in, prmLTEPDSCH)
% Precoder for PDSCH spatial multiplexing
%#codegen
% Assumes the incoming codewords are of the same length
v = prmLTEPDSCH.numLayers;              % Number of layers
% Initialize the output
out = complex(zeros(size(in)));
inLen = size(in, 1);
% Apply the relevant precoding matrix to the symbol over all layers
for n = 1:inLen% Compute the precoding matrix% 获得 W D U[W, D, U] = PrecoderMatrixOpenLoop(n, v);T=W *D*U;% 预编码temp = T* (in(n, :).');out(n, :) = temp.';
end
function [W, D, U] = PrecoderMatrixOpenLoop(n, v)
% 开环MIMO的预编码矩阵
% 实现有问题,参考https://zhuanlan.zhihu.com/p/495045923进行了修改
% LTE Precoder for PDSCH spatial multiplexing.
%#codegen
% i四个就循环了,所以直接mod4
idx=mod(n-1,4);
switch v% 层为1,会退化到TM2,不考虑这样的情况case 1% 涉及到TM3模式的CCD有WUD三个矩阵% 单流就是这样,相当于没有进行CCDW=complex(1,0);U=W;D=W;% 层为2case 2% 是否少了(1/sqrt(2))% W= [1 0; 0 1];W=(1/sqrt(2)) * [1 0; 0 1];U=(1/sqrt(2))*[1 1;1 exp(-1j*pi)];D=[1 0;0 exp(-1j*pi*idx)];case 4 k=1+mod(floor(n/4),4);switch kcase 1, un = [1 -1 -1 1].';case 2, un = [1 -1 1 -1].';case 3, un = [1 1 -1 -1].';case 4, un = [1 1 1 1].';endW = eye(4) - 2*(un*un')./(un'*un);switch k    % order columnscase 3W = W(:, [3 2 1 4]);case 2W = W(:, [1 3 2 4]);enda=[0*(0:1:3);2*(0:1:3);4*(0:1:3);6*(0:1:3)];U=(1/2)*exp(-1j*pi*a/4);b=0:1:3;D=diag(exp(-1j*2*pi*idx*b/4));
end

2.全流程

function [dataIn, dataOut, txSig, rxSig, dataRx, yRec, csr_ref]...= commlteMIMO_SM_Mode3_step(nS, snrdB, prmLTEDLSCH, prmLTEPDSCH, prmMdl)
%% TX
%  Generate payload
dataIn = genPayload(nS,  prmLTEDLSCH.TBLenVec);
% Transport block CRC generation
tbCrcOut1 =CRCgenerator(dataIn);
% Channel coding includes - CB segmentation, turbo coding, rate matching,
% bit selection, CB concatenation - per codeword
[data, Kplus1, C1] = lteTbChannelCoding(tbCrcOut1, nS, prmLTEDLSCH, prmLTEPDSCH);
%Scramble codeword
scramOut = lteScramble(data, nS, 0, prmLTEPDSCH.maxG);
% Modulate
modOut = Modulator(scramOut, prmLTEPDSCH.modType);
% Map modulated symbols  to layers
% 调制后进行层映射,这里是单流
numTx=prmLTEPDSCH.numTx;
LayerMapOut = LayerMapper(modOut, [], prmLTEPDSCH);
% Precoding
% 预编码
PrecodeOut = SpatialMuxPrecoderOpenLoop(LayerMapOut, prmLTEPDSCH);
% Generate Cell-Specific Reference (CSR) signals
csr = CSRgenerator(nS, numTx);
csr_ref=complex(zeros(2*prmLTEPDSCH.Nrb, 4, numTx));
for m=1:numTxcsr_pre=csr(1:2*prmLTEPDSCH.Nrb,:,:,m);csr_ref(:,:,m)=reshape(csr_pre,2*prmLTEPDSCH.Nrb,4);
end
% Resource grid filling
txGrid = REmapper_mTx(PrecodeOut, csr_ref, nS, prmLTEPDSCH);
% OFDM transmitter
txSig = OFDMTx(txGrid, prmLTEPDSCH);
%% Channel
% MIMO Fading channel
[rxFade, chPathG] = MIMOFadingChan(txSig, prmLTEPDSCH, prmMdl);
% Add AWG noise
sigPow = 10*log10(var(rxFade));
nVar = 10.^(0.1.*(sigPow-snrdB));
rxSig =  AWGNChannel(rxFade, nVar);
%% RX
% OFDM Rx
rxGrid = OFDMRx(rxSig, prmLTEPDSCH);
% updated for numLayers -> numTx
[dataRx, csrRx, idx_data] = REdemapper_mTx(rxGrid, nS, prmLTEPDSCH);
% MIMO channel estimation
if prmMdl.chEstOnchEst = ChanEstimate_mTx(prmLTEPDSCH, csrRx,  csr_ref, prmMdl.chEstOn);hD     = ExtChResponse(chEst, idx_data, prmLTEPDSCH);
elseidealChEst = IdChEst(prmLTEPDSCH, prmMdl, chPathG);hD =  ExtChResponse(idealChEst, idx_data, prmLTEPDSCH);
end
% Frequency-domain equalizer
if (numTx==1)% Based on Maximum-Combining Ratio (MCR)yRec = Equalizer_simo(dataRx, hD,mean(nVar), prmLTEPDSCH.Eqmode);
else% Based on Spatial MultiplexingyRec = MIMOReceiver_OpenLoop(dataRx, hD, prmLTEPDSCH, nVar);
end
% Demap received codeword(s)
[cwOut, ~] = LayerDemapper(yRec, prmLTEPDSCH);    
if prmLTEPDSCH.Eqmode < 3% DemodulatedemodOut = DemodulatorSoft(cwOut, prmLTEPDSCH.modType, mean(nVar));
elsedemodOut = cwOut;
end
% Descramble received codeword
rxCW =  lteDescramble(demodOut, nS, 0, prmLTEPDSCH.maxG);
% Channel decoding includes - CB segmentation, turbo decoding, rate dematching
[decTbData1, ~,~] = lteTbChannelDecoding(nS, rxCW, Kplus1, C1,  prmLTEDLSCH, prmLTEPDSCH);
% Transport block CRC detection
[dataOut, ~] = CRCdetector(decTbData1);
end

可以看到,数据先进行层映射,再进行预编码,在层映射阶段,数据被映射为层数列,而预编码的意义就是再把层数映射到天线数列

这里要重点说一下的是接收机的均衡的解算

function y = MIMOReceiver_MMSE_OpenLoop(in, chEst, nVar, v)
%#codegen
% MIMO Receiver:
%   Based on received channel estimates, process the data elements
%   to equalize the MIMO channel. Uses the MMSE detector.
% noisFac = numLayers*diag(nVar);
noisFac = diag(nVar);
numData = size(in, 1);
y = complex(zeros(size(in)));
%% MMSE receiver
for n = 1:numData[W, D, U] = PrecoderMatrixOpenLoop(n, v);% iWn = (W *D*U)';             % Orthonormal matrix,W并不一定是酉矩阵吗这是不对的iWn = inv(W *D*U);h = chEst(n, :, :);               % numTx x numRx% 哪有这样的,层不一定等于天线数!h = reshape(h(:), v, v).';    % numRx x numTxQ = (h'*h + noisFac)\h';x = Q * in(n, :).';tmp = iWn * x;y(n, :) = tmp.';
end

这份代码有一个重大的问题,就是它默认了层=天线数,这是错误的!但由于是2天线的情况,暂时不追究

此外,W不是一个酉矩阵,不可以这样解算


http://chatgpt.dhexx.cn/article/BpEZphpB.shtml

相关文章

认识LTE(八):LTE中的反馈:闭环空分复用(TM4)

认识LTE(八)&#xff1a;LTE中的反馈&#xff1a;闭环空分复用&#xff08;TM4&#xff09; 文章目录 认识LTE(八)&#xff1a;LTE中的反馈&#xff1a;闭环空分复用&#xff08;TM4&#xff09;零.代码地址一.TM4到底反馈了什么&#xff1f;二.CQI反馈二.PMI 三.RI四.总结 零.…

图解通信原理与案例分析-21:4G LTE多天线技术--天线端口、码流、分集Diveristy、波束赋形BF、空分复用MIMO、空分多址

目录 前言&#xff1a; 第1章 MIMO多天线技术概述 1.1 三大目的 1.2 六大分类 第2章 单天线SISO&#xff08;单输入单输出&#xff09; 2.1 概述 2.2 实现原理--多路“异频”《发送接收》对 第3章 接收分集MISO&#xff08;多输入单输出&#xff09;&#xff1a;冗余接…

[4G5G专题-28]:架构-什么是多天线技术与5G大规模天线阵列、波束赋形、高阶空分复用?

目录 第1章 多天线技术概述 1.1 LTE的多天线技术回顾 1.2 5G大规模天线阵列、波束赋形以及其动机 第2章 什么是波束赋形 2.1 波束赋形与大规模天线阵列的关系 2.2 波束赋形的定义 2.3 波束赋形要回答和解决的两个问题 2.4 常见的波束赋形相关的专业术语 第3章 Active …

复用,多址的区分以及其涉及的相关数据速率

复用技术 为了让尽可能多的手机使用同一个频段&#xff0c;无线通信设计了多址复用技术&#xff1a; 时分多路复用&#xff08;Time Division Multiplexing&#xff0c;TDM)要求各个子通道按时间片轮流地占用整个带宽。时间片的大小可以按一次传送一位、一个字节或一个固定大…

王道 —— 操作系统的四个特征

1、知识总览 操作系统有并发、共享、虚拟、异步四个基本特征&#xff0c;并发和共享是两个最基本的特征&#xff0c;二者互为存在条件&#xff1b; 2、操作系统的特征 —— 并发 并发&#xff1a;指两个或者多个时间在同一时间间隔内发生。这些事件宏观上是同时发生的&#x…

操作系统学习笔记——总体总结

看书太慢容易抓不住重点&#xff0c;所以在此按照操作系统的主要内容分别查网上博客资料进行学习。 一、引论 操作系统基本特性&#xff1a; 并发&#xff1a; 1.并行与并发&#xff1a;并行性是指两个或多个时间在同一时刻发送&#xff1b;并发性是指两个或多是事件在同一…

数据库脏读、不可重复读、幻读

1. 脏读 &#xff1a;脏读就是指当一个事务正在访问数据&#xff0c;并且对数据进行了修改&#xff0c;而这种修改还没有提交到数据库中&#xff0c;这时&#xff0c;另外一个事务也访问这个数据&#xff0c;然后使用了这个数据。 2. 不可重复读 &#xff1a;是指在一个事务内&…

关于可重复读和幻读

最近看到MySQL隔离性的知识&#xff0c;发现网上很多人说可重复读所针对的操作是update&#xff0c;然后亲自试验了一把&#xff0c;见下文。 首先我们知道在读提交隔离级别下&#xff0c;同一事物A中以相同的查询语句可能得到的结果不一致的情况&#xff0c;即不可重复读。这是…

可重复读如何解决幻读

学习之前的疑问&#xff1a; 可重复读的概念 与 不可重复读的概念 行锁gap锁(间隙锁) 快照读 与 当前读区别 快照读中的MVCC 当前读中的gap锁 和 行锁 前几天面试时被问到了mysql可重复读如何解决幻读的问题&#xff0c;之前脑子中的概念只有增加了共享锁和排他锁进行避免&…

MySQL(四)—MVCC实现可重复读的原理

文章目录 一、MVCC概况二、MVCC实现原理1.两或三个隐藏字段。2.undo log3.一个数组4.ReadView 三、举例验证MVCC原理参考文献 一、MVCC概况 MVCC是什么&#xff1f;MVCC即多版本控制协议&#xff0c;InnoDB实现了MVCC作版本控制&#xff0c;防止不该被当前事务看到的数据看到。…

可重复读

《循序渐进DB2-系统管理、运行维护与应用案例》第10章锁和并发&#xff0c;本章首先介绍了通用的事务概念&#xff0c;并指出DB2在用户读取、写入数据时的加锁策略、锁模式、兼容性等。本章还介绍了在并发控制中常碰到的4种数据异常现象&#xff0c;同时讲述了DB2如何使用锁克服…

mysql不可重复读和重复读_脏读、幻读、不可重复读的区别是什么

脏读、幻读、不可重复读的区别&#xff1a;1、脏读就是指当一个事务正在访问数据&#xff0c;并且对数据进行了修改&#xff1b;2、不可重复读是指在一个事务内&#xff0c;多次读同一数据&#xff1b;3、幻读是指当事务不是独立执行时发生的一种现象。 【相关学习推荐&#xf…

Mysql如何实现可重复读

首先对于mysql来说相信也并不陌生&#xff0c;mysql默认的事务的隔离级别是3&#xff0c;即可以实现可重复读&#xff0c;那mysql又是怎样实现可重复读的呢&#xff1f; 下边进行简单的介绍 这里就要提到了mvcc&#xff0c;即多版本并发控制 首先先来看一个事务的执行图 此时…

MySQL 可重复读隔离级别,完全解决幻读了吗?

我在上一篇文章中提到&#xff0c;MySQL InnoDB 引擎的默认隔离级别虽然是「可重复读」&#xff0c;但是它很大程度上避免幻读现象&#xff08;并不是完全解决了&#xff09;&#xff0c;解决的方案有两种&#xff1a; 针对快照读&#xff08;普通 select 语句&#xff09;&am…

MySQL可重复读-问题实践

MySQL可重复读之幻读问题 MySQL事务存储引擎InnoDB的默认隔离级别为可重复读&#xff0c;在该隔离级别下&#xff0c;可以很大程度上避免幻读的问题&#xff0c;完全避免脏读和不可重复读问题&#xff0c;接下来通过实际的测试看看这些场景是否真的能够被完全避免 模拟均基于…

可重复读下的幻读

在事务执行过程中&#xff0c;另一个事务将新记录添加到正在读取的事务中时&#xff0c;会发生幻读&#xff08;事务隔离级别为可重复读REPEATABLE-READ&#xff09;。当执行SELECT … WHERE语句时未对where范围锁定&#xff0c;则可能会发生幻读。幻读是不可重复读的一种特殊情…

MySQL可重复读应用场景_mysql-repeatable read 可重复读隔离级别-幻读实例场景

本文详解 repeatable read 可重复读 隔离级别产生的影响(幻读) -- SERIALIZABLE serializable 序列化 &#xff1b;一个个事务排成序列的形式。事务一个挨一个执行&#xff0c;等待前一个事务执行完&#xff0c;后面的事务才可以顺序执行 -- REPEATEABLE READ repeatable read …

MySQL可重复读级别能够解决幻读吗

引言 之前在深入了解数据库理论的时候&#xff0c;了解到事物的不同隔离级别可能存在的问题。为了更好的理解所以在MySQL数据库中测试复现这些问题。关于脏读和不可重复读在相应的隔离级别下都很容易的复现了。但是对于幻读&#xff0c;我发现在可重复读的隔离级别下没有出现&…

mysql不可重复读和重复读_MySql隔离级别:RU / RC / RR / S + 脏读 / 不可重复读 / 幻读 / 可重复读...

MySQL 事务 本文所说的 MySQL 事务都是指在 InnoDB 引擎下&#xff0c;MyISAM 引擎是不支持事务的。 数据库事务指的是一组数据操作&#xff0c;事务内的操作要么就是全部成功&#xff0c;要么就是全部失败&#xff0c;什么都不做&#xff0c;其实不是没做&#xff0c;是可能做…

mysql可重复读 加锁_mysql可重复读隔离级别加锁分析

问题 myql可重复读隔离级别下可能会导致插入阻塞&#xff0c;问题复现如下 表中有3列都是int类型 其索引情况如下&#xff1a; id为主索引&#xff0c;c,d为普通索引 现在开始制作问题&#xff1a; 在这里我分别开启两个事务&#xff1a;第一个事务中执行一个update 语句更新一…