应用办公生活信息教育商业
投稿投诉
商业财经
汽车智能
教育国际
房产环球
信息数码
热点科技
生活手机
晨报新闻
办公软件
科学动态
应用生物
体育时事

技术分享什么是半一致性读?

  作者:赵黎明
  爱可生MySQLDBA团队成员,Oracle10gOCM,MySQL5。7OCP,擅长数据库性能问题诊断、事务与锁问题的分析等,负责处理客户MySQL及我司自研DMP平台日常运维中的问题,对开源数据库相关技术非常感兴趣。
  本文来源:原创投稿爱可生开源社区出品,原创内容未经授权不得随意使用,转载请联系小编并注明来源。
  什么是半一致性读?
  先看下官方的描述:
  是一种用在Update语句中的读操作(一致性读)的优化,是在RC事务隔离级别下与一致性读的结合。
  当Update语句的where条件中匹配到的记录已经上锁,会再次去InnoDB引擎层读取对应的行记录,判断是否真的需要上锁(第一次需要由InnoDB先返回一个最新的已提交版本)。
  只在RC事务隔离级别下或者是设置了innodblocksunsafeforbinlog1的情况下才会发生。
  innodblocksunsafeforbinlog参数在8。0版本中已被去除(可见,这是一个可能会导致数据不一致的参数,官方也不建议使用了)。
  测试案例
  InnoDB引擎的强大之处就在于它能完美地支持事务,而事务的一致性则是由事务隔离级别和并发事务锁来保证的。接下来,我们先通过2个测试案例来观察半一致性读会对事务产生哪些影响。
  案例1
  RC隔离级别,3个Session执行事务语句创建测试表rootlocalhost:mysqld。sock〔zlm〕5。7。30logcreatetablezlm。t(idint,salint)engineinnodbdefaultcharactersetutf8mb4;QueryOK,0rowsaffected(0。06sec)
  rootlocalhost:mysqld。sock〔zlm〕5。7。30logshowcreatetablezlm。tG。rowTable:tCreateTable:CREATETABLEt(idint(11)DEFAULT,salint(11)DEFAULT)ENGINEInnoDBDEFAULTCHARSETutf8mb4rowinset(0。01sec)
  写入测试数据(创建插入数据的存储过程)rootlocalhost:mysqld。sock〔zlm〕5。7。30logdropprocedureifexistszlm。proct;QueryOK,0rowsaffected(0。00sec)
  rootlocalhost:mysqld。sock〔zlm〕5。7。30logdelimiterrootlocalhost:mysqld。sock〔zlm〕5。7。30logcreateprocedurezlm。proctbegindeclareiintdefault;declarejintdefault100;whilei11doinsertintot(id,sal)values(i,j);setii;setjj100;endwhile;endQueryOK,0rowsaffected(0。01sec)
  rootlocalhost:mysqld。sock〔zlm〕5。7。30logdelimiter;rootlocalhost:mysqld。sock〔zlm〕5。7。30logselectfromt;idsal10022003004400550066007008800990010100010rowsinset(0。00sec)
  开启RC隔离级别rootlocalhost:mysqld。sock〔zlm〕5。7。30logsetglobal。txisolationreadcommitted;QueryOK,0rowsaffected,1warning(0。00sec)
  注意,从8。0。3版本开始,去掉了txisolation参数,参数名只支持transactionisolation开启两个新的Session(设置global参数后,仅对新连接生效)确认Session的隔离级别和线程IDrootlocalhost:mysqld。sock〔(none)〕5。7。30logshowvariablesliketxisolation;VariablenameValuetxisolationREADCOMMITTEDrowinset(0。01sec)
  rootlocalhost:mysqld。sock〔(none)〕5。7。30logselectconnectionid;connectionidrowinset(0。00sec)
  Session执行当前读的Select语句rootlocalhost:mysqld。sock〔zlm〕5。7。30logbegin;selectfromtwhereidandid6forupdate;QueryOK,0rowsaffected(0。00sec)
  idsal4005500rowsinset(0。00sec)
  查看加锁详情(需设置参数innodbstatusoutputlockson,否则看不到IX锁)线程的事务1314,获取到了个表级插入意向锁IX,个记录锁,对应id,id5的这两条记录TRANSACTION1313,ACTIVEseclockstruct(s),heapsize1136,rowlock(s)MySQLthreadid,OSthreadhandle140086065960704,queryid277localhostrootTABLELOCKtablezlm。ttrxid1313lockmodeIXRECORDLOCKSspaceid23pagenonbits80indexGENCLUSTINDEXoftablezlm。ttrxid1313lockmodeXlocksrecbutnotgapRecordlock,heapno5PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000204;asc;;:len6;hex000000000515;asc;;:len;hexb0000001240110;asc;;:len;hex80000004;asc;;:len;hex80000190;asc;;
  Recordlock,heapno6PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000205;asc;;:len6;hex000000000516;asc;;:len;hexb1000001250110;asc;;:len;hex80000005;asc;;:len;hex800001f4;asc;;
  确认Session的隔离级别和线程IDrootlocalhost:mysqld。sock〔(none)〕5。7。30logshowvariablesliketxisolation;VariablenameValuetxisolationREADCOMMITTEDrowinset(0。00sec)
  rootlocalhost:mysqld。sock〔(none)〕5。7。30logselectconnectionid;connectionid9rowinset(0。00sec)
  Session执行当前读的Select语句rootlocalhost:mysqld。sock〔zlm〕5。7。30logbegin;selectfromtwhereidforupdate;QueryOK,0rowsaffected(0。00sec)
  ERROR1205(HY000):Unknownerror12051205表示锁等待超时,这里吐槽下最新GA的5。7。30,遇到错误仅会抛出一个代码,没有错误描述,不方便排查
  查看加锁详情innodb锁等待超时前,可以看到线程9的1314事务正在请求并等待个记录锁,id的这条记录TRANSACTION1314,ACTIVEsecfetchingrowsmysqltablesinuse,lockedLOCKWAITlockstruct(s),heapsize1136,rowlock(s)MySQLthreadid9,OSthreadhandle140086065690368,queryid282localhostrootSendingdataselectfromtwhereidforupdateTRXHASBEENWAITINGSECFORTHISLOCKTOBEGRANTED:RECORDLOCKSspaceid23pagenonbits80indexGENCLUSTINDEXoftablezlm。ttrxid1314lockmodeXlocksrecbutnotgapwaitingRecordlock,heapno5PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000204;asc;;:len6;hex000000000515;asc;;:len;hexb0000001240110;asc;;:len;hex80000004;asc;;:len;hex80000190;asc;;
  TABLELOCKtablezlm。ttrxid1314lockmodeIXRECORDLOCKSspaceid23pagenonbits80indexGENCLUSTINDEXoftablezlm。ttrxid1314lockmodeXlocksrecbutnotgapRECORDLOCKSspaceid23pagenonbits80indexGENCLUSTINDEXoftablezlm。ttrxid1314lockmodeXlocksrecbutnotgapwaitingRecordlock,heapno5PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000204;asc;;:len6;hex000000000515;asc;;:len;hexb0000001240110;asc;;:len;hex80000004;asc;;:len;hex80000190;asc;;
  innodb锁等待超时后再观察一次,线程9的事务1314的事务仍然没有结束,对t表持有IX锁,并且仍然在等待id的行锁释放TRANSACTION1314,ACTIVE453seclockstruct(s),heapsize1136,rowlock(s)MySQLthreadid9,OSthreadhandle140086065690368,queryid282localhostrootTABLELOCKtablezlm。ttrxid1314lockmodeIXRECORDLOCKSspaceid23pagenonbits80indexGENCLUSTINDEXoftablezlm。ttrxid1314lockmodeXlocksrecbutnotgap
  确认Session的隔离级别和线程IDVariablenameValuetxisolationREADCOMMITTEDrowinset(0。01sec)
  rootlocalhost:mysqld。sock〔(none)〕5。7。30logselectconnectionid;connectionid10rowinset(0。00sec)
  Session执行Update语句rootlocalhost:mysqld。sock〔zlm〕5。7。30logbegin;updatetsetsalsalwhereid;QueryOK,0rowsaffected(0。00sec)
  QueryOK,rowaffected(0。00sec)
  在Session1事务仍然未结束的情况下,Session3的事务未被阻塞,可以正常执行。查看个语句的执行计划rootlocalhost:mysqld。sock〔zlm〕5。7。30logexplainselectfromtwhereidandid6forupdate;idselecttypetablepartitionstypepossiblekeyskeykeylenrefrowsfilteredExtraSIMPLEtALL1011。11Usingwhererowinset,warning(0。00sec)
  rootlocalhost:mysqld。sock〔zlm〕5。7。30logexplainselectfromtwhereidforupdate;idselecttypetablepartitionstypepossiblekeyskeykeylenrefrowsfilteredExtraSIMPLEtALL1010。00Usingwhererowinset,warning(0。00sec)
  rootlocalhost:mysqld。sock〔zlm〕5。7。30logexplainupdatetsetsalsalwhereid;idselecttypetablepartitionstypepossiblekeyskeykeylenrefrowsfilteredExtraUPDATEtALL10100。00Usingwhererowinset(0。00sec)
  意料之中,由于t表没有索引,执行计划必然是走全表扫描,也就是每条被读取到的记录,都会上行锁。那为何Session1只锁了id4,id5的这两条,并没有锁全表呢?而同样是请求id7的记录,为何Session2无法获取锁资源,Session3却能成功执行?也许大家从上面的锁分析可以很快得到结论,由于Session1只占用了id4、id5的行锁,那么Session3去请求id7的自然不会有冲突(似乎挺有道理)那么Session2对id7的请求,为何会被锁定呢?
  带着这些疑问,我们继续看第2个案例。
  案例2
  RC隔离级别,这次Session1执行的Select语句不带where条件Session1执行当前读的Select语句rootlocalhost:mysqld。sock〔zlm〕5。7。30logbegin;selectfromtforupdate;QueryOK,0rowsaffected(0。00sec)
  idsal11002200330044005500660077008800990010100010rowsinset(0。00sec)
  查看加锁详情线程8的1317事务获得了1个IX表锁和10个X记录锁,即:把表中的10条记录都锁定了t表上没有索引,MySQL默认会创建GENCLUSTINDEX的聚簇索引,而语句没有加where条件,只能走全表扫描,每条被读取的记录,都要在聚簇索引上加上记录锁(全表记录锁,相当于一个表锁了)TRANSACTION1317,ACTIVE5seclockstruct(s),heapsize1136,10rowlock(s)MySQLthreadid8,OSthreadhandle140086065960704,queryid312localhostrootTABLELOCKtablezlm。ttrxid1317lockmodeIXRECORDLOCKSspaceid23pageno3nbits80indexGENCLUSTINDEXoftablezlm。ttrxid1317lockmodeXlocksrecbutnotgapRecordlock,heapno2PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000201;asc;;:len6;hex00000000050e;asc;;:len7;hexab0000011f0110;asc;;:len4;hex80000001;asc;;:len4;hex80000064;ascd;;
  Recordlock,heapno3PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000202;asc;;:len6;hex00000000050f;asc;;:len7;hexac000001200110;asc;;:len4;hex80000002;asc;;:len4;hex800000c8;asc;;
  Recordlock,heapno4PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000203;asc;;:len6;hex000000000514;asc;;:len7;hexaf000001230110;asc;;:len4;hex80000003;asc;;:len4;hex8000012c;asc,;;
  Recordlock,heapno5PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000204;asc;;:len6;hex000000000515;asc;;:len7;hexb0000001240110;asc;;:len4;hex80000004;asc;;:len4;hex80000190;asc;;
  Recordlock,heapno6PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000205;asc;;:len6;hex000000000516;asc;;:len7;hexb1000001250110;asc;;:len4;hex80000005;asc;;:len4;hex800001f4;asc;;
  Recordlock,heapno7PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000206;asc;;:len6;hex000000000517;asc;;:len7;hexb2000001260110;asc;;:len4;hex80000006;asc;;:len4;hex80000258;ascX;;
  Recordlock,heapno8PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000207;asc;;:len6;hex000000000518;asc;;:len7;hexb3000001270110;asc;;:len4;hex80000007;asc;;:len4;hex800002bc;asc;;
  Recordlock,heapno9PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000208;asc;;:len6;hex000000000519;asc;;:len7;hexb4000001280110;asc(;;:len4;hex80000008;asc;;:len4;hex80000320;asc;;
  Recordlock,heapno10PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000209;asc;;:len6;hex00000000051a;asc;;:len7;hexb5000001290110;asc);;:len4;hex80000009;asc;;:len4;hex80000384;asc;;
  Recordlock,heapno11PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex00000000020a;asc;;:len6;hex00000000051b;asc;;:len7;hexb60000012a0110;asc;;:len4;hex8000000a;asc;;:len4;hex800003e8;asc;;
  Session2执行当前读的Select语句rootlocalhost:mysqld。sock〔zlm〕5。7。30logbegin;selectfromtwhereid7forupdate;QueryOK,0rowsaffected(0。00sec)
  ERROR1205(HY000):Unknownerror1205
  与之前案例1相同,也是锁等待超时退出。查看加锁详情这次线程9的事务1318从第1条记录就开始加锁了TRANSACTION1318,ACTIVE4secstartingindexreadmysqltablesinuse1,locked1LOCKWAIT2lockstruct(s),heapsize1136,1rowlock(s)MySQLthreadid9,OSthreadhandle140086065690368,queryid315localhostrootSendingdataselectfromtwhereid7forupdateTRXHASBEENWAITING4SECFORTHISLOCKTOBEGRANTED:RECORDLOCKSspaceid23pageno3nbits80indexGENCLUSTINDEXoftablezlm。ttrxid1318lockmodeXlocksrecbutnotgapwaitingRecordlock,heapno2PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000201;asc;;:len6;hex00000000050e;asc;;:len7;hexab0000011f0110;asc;;:len4;hex80000001;asc;;:len4;hex80000064;ascd;;
  TABLELOCKtablezlm。ttrxid1318lockmodeIXRECORDLOCKSspaceid23pageno3nbits80indexGENCLUSTINDEXoftablezlm。ttrxid1318lockmodeXlocksrecbutnotgapwaitingRecordlock,heapno2PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000201;asc;;:len6;hex00000000050e;asc;;:len7;hexab0000011f0110;asc;;:len4;hex80000001;asc;;:len4;hex80000064;ascd;;
  Session3执行Update语句rootlocalhost:mysqld。sock〔zlm〕5。7。30logbegin;updatetsetsalsal1whereid7;QueryOK,0rowsaffected(0。00sec)
  ERROR1205(HY000):Unknownerror1205
  与案例1不同的是,这次Update语句也遭遇锁等待超时退出了。查看加锁详情这次Session3请求id7的记录锁,该锁被Session1持有未释放,导致了Session3锁等待超时TRANSACTION1319,ACTIVE14secfetchingrowsmysqltablesinuse1,locked1LOCKWAIT2lockstruct(s),heapsize1136,8rowlock(s)MySQLthreadid10,OSthreadhandle140086066231040,queryid322localhostrootupdatingupdatetsetsalsal1whereid7TRXHASBEENWAITING14SECFORTHISLOCKTOBEGRANTED:RECORDLOCKSspaceid23pageno3nbits80indexGENCLUSTINDEXoftablezlm。ttrxid1319lockmodeXlocksrecbutnotgapwaitingRecordlock,heapno8PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000207;asc;;:len6;hex000000000518;asc;;:len7;hexb3000001270110;asc;;:len4;hex80000007;asc;;:len4;hex800002bc;asc;;
  TABLELOCKtablezlm。ttrxid1319lockmodeIXRECORDLOCKSspaceid23pageno3nbits80indexGENCLUSTINDEXoftablezlm。ttrxid1319lockmodeXlocksrecbutnotgapwaitingRecordlock,heapno8PHYSICALRECORD:nfields5;compactformat;infobits00:len6;hex000000000207;asc;;:len6;hex000000000518;asc;;:len7;hexb3000001270110;asc;;:len4;hex80000007;asc;;:len4;hex800002bc;asc;;
  案例分析
  由于t表上不存在索引,3个会话执行的语句都是全表扫描,在RC事务隔离级别下,这些语句都是需要发起当前读的操作(读取t表上最新的已提交事务版本),需要对读取到的全部记录加上记录锁(即行锁、也可称为InnoDB锁,大多数情况下,RC隔离级别没有Gap锁,因此基本不太会出现NextKey锁,对高并发场景比较友好)。
  案例1
  Session1:开始需要对每条记录加锁,由于不需要维护可重复读,也不需要锁Gap,当返回MySQLServer层通过where条件过滤后,最终只对id4、id5的记录加了锁。
  Session2:从id1开始读取记录并加锁,当读取到id4的记录时,由于Session1先对id4的记录上了锁,就无法再对其进行加锁操作,我们看到它一直在等待id4的X锁,直到锁等待超时报错,为何是id4,而不是id5?因为是按聚簇索引一条条读取记录的,所以锁也需要一条条加,当上一条记录的锁资源没获取到,就不会对下一条记录加锁。
  Session3:同样地,最开始也需要对读取到的记录一条条加锁,由于id7的记录与id4、id5上的行锁并不冲突,此处可以利用半一致性读对Update的优化特性,提前将id7上的行锁释放掉了,因此Update不会被阻塞,事务得以正常执行。
  案例2
  Session1:Select语句没有用where条件,通过全表扫描访问到的所有记录都无法通过MySQLServer层过滤,因此将t表的全部记录都上了X锁。
  Session2:由于Session1已经将全部记录都上了X锁,Session2当前读的Select操作由于无法获取任何记录的X锁,就被阻塞了。
  Session3:同样地,Session1持有的全记录X锁,使Session3的where条件落到了匹配的区间内,表示Session1对id7的行确实需要更新,必须上锁,因此Session3的Update被阻塞。
  总结
  在RC事务隔离级别下,Update语句可以利用到半一致性读的特性,会多进行一次判断,当where条件匹配到的记录与当前持有锁的事务中的记录不冲突时,就会提前释放InnoDB锁,虽然这样做违背了二阶段加锁协议,但却可以减少锁冲突,提高事务并发能力,是一种很好的优化行为。
  参考链接
  https:dev。mysql。comdocrefman5。7eninnodbconsistentread。html
  https:dev。mysql。comdocrefman5。7eninnodblocksset。html
  https:my。oschina。netJKOPERAblog1929335
  社区近期动态

北大院长批评学霸,你们太完美了,就像一个模子造出来的家具我们之所以送孩子上学,并不是因为孩子必须要上学,而是因为他们要为未来的生活做好充分的准备。我们总喜欢讨论学习的意义是什么、读书的意义是什么这类话题,如果单纯从表面上来说,……新手爸妈必备,给宝宝刷牙的正确打开方式花爸说:然而如何选购合适的牙刷和牙膏?成了不少新手父母的一大难题。因此,今天满满的干货花爸这就为你奉上!如何选牙刷?花爸建议根据宝宝年龄段选择牙刷:12……下雨天,是你不再懂得的快乐这个夏天来的比往年早,雨水也比往年多。曾经的我,一到下雨天就有冲到雨里淋雨的冲动,有时候甚至会拉着身边的人一起。上次淋雨,都是06年高中毕业那年的事了。这几天大湖南的天气……教育厅传来消息,学生开学或将线上上课,家长表示无可奈何导语:去年因为疫情的原因,很多学校都采取了线上教学的形式,遵循无接触上课的原则,全中国人居家办公,居家学习,这就成为了一大奇特的景观。十四亿中国人,全部在家里不出门,就是……萱恩妈咪课堂什么是生化妊娠?孕期要补的黑知识!生化妊娠是指精子、卵结合了,生成了受精卵,但是受精卵没有回到子宫里着床,或者是回来了,没有着上床,医学上称此为亚临床流产。发生生化妊娠的原因主要是胚胎本身质量不好,或者受……奥运冠军经历曝光,他们的秘密藏不住了今年东京奥运会,你最喜欢哪个运动员?目前我国拿到金牌的运动员里,不少00后!真是开挂的人生啊!看了比赛,网友都这么感叹。冠军,是一个孩子成长缩影的华丽收尾。……这是我的劫看着我的孩子,人活在世界上,总要有那么一些精神寄托吧。可是惯子如杀子,终究还是太宠他了。太在乎孩子的感受,而忽略了自己的感受。为了孩子的将就和妥协。终于……乳腺癌术后患肢功能锻炼在我国,乳腺癌的发病率呈逐年上升趋势,部分大城市报告中乳腺癌占女性恶性肿瘤首位。而这种疾病首选治疗是手术治疗,由于手术切除了胸部肌肉、筋膜和皮肤,使患侧肩关节活动明显受限制。术……来天津医科大学总医院看病,这份指南一定要收藏看病,是每个人既无奈又必须经历的。为了方便广大患者就医,小Q今后将定期推出天津部分三甲医院的看病就医指南,内容涵盖预约、挂号、取号、爽约、取消预约等方面,记得保存收藏。看……宝贝成长记今天是二宝心心出生的第90天,今天的上海降温了,感觉特别冷,昨天还热的穿短袖短裤,今天突然变天了,弄的我都不知道给孩子们穿什么了〔捂脸〕,昨天晚上心心躺在摇椅上抠嘴,结果抠吐奶……天生我材必有用逻辑数学智能第一个注意到7条鱼与7天这两组数字之间相似之处的人,在思想史上迈出了一大步。他是第一位拥有纯数学科学概念的人。有一天,一名将要成为数学家的儿童,在自己面前看到了一组物体,……一年级坚持8点半睡的孩子,现在怎么样了?文图图妈来源三个妈妈六个娃最近,全国政协委员、江苏省锡山高级中学校长唐江澎火出了圈,他关于教育的真谛是什么的回答,引发了大家的思考,也让大家记住了那句话:学生……
德国电饭煲中国心,瞬间脱糖34,就靠古法蒸饭过滤一键操作随着社会发展的越来越好,我们的生活水平也在逐渐提高,饮食更是各式各样。但就在这吃中却吃出了病,糖尿病便是其中之一。目前我国糖尿病患者已达1。2亿,并且每年还在以120万的……对于孩子的专注力培养,真的有这么重要吗?我的好妈妈,下班回到家,劳动了一天,妈妈辛苦了然而,你可能想像不到,劳动了一天的妈妈下班回到家,包包都还没有来得及放下,又要紧张地从一个战场转到另一个战场辅导作业。……8岁学生数学得99分后崩溃,孩子收起你的玻璃心,人生需要钝感8岁的铭铭上小学二年级,他聪明好学,成绩优异。有个缺点就是非常敏感和在乎别人对他的评价。有一次,铭铭穿了一件红色带帽卫衣,同学说他像小红帽,他就再也没有穿过那件衣服。……专家带你解析痛风石,没有控制好尿酸的恶果!医师简介:储永良,广东省中医院珠海医院风湿科主任、硕士生导师、第一批国医大师李济仁岭南学术继承人,广东省中西医结合学会痛风分会常委,《风湿病与关节炎》编委。擅长中西……把日历做成手帐,就实用多了!(附食谱成长知识点)我家里一直有用纸质日历的习惯,台式、挂式或是书本形式的,年年都有买。(去年买的日历)一套好用的日历,不仅起到标注日期的作用,还可以用它记录孩子的成长足迹。这样我们回……上海一男子用500克黄金制1000粒米扔进黄浦江等地,讽刺浪近日,上海一名男子用500克黄金打造了1000粒纯金大米,然后一粒一粒将其扔进黄浦江、垃圾桶、下水道、地下铁、公园的草丛里等地。他以这种行为艺术,讽刺人们粮食浪费的问题,并希望……(16)漫画自己教育自己父母的表态,也是孩子行为的一面镜子。有时候不需要用语言,面部表情往往效果更好。(有的家长,对孩子的错误,话说得很重,但是面部表情很轻松,会给孩子传递错误的信息。)让孩子自……世界级牛逼的多元智能理论,你知道吗?《发现孩子的天赋》书稿发布(24)直到上世纪后期的1983年,美国心理学家和教育学家、哈佛大学教育研究院霍华德加德纳(HowardGardner)教授才首次突破了此前人对……谜语(小小说)儿子把书包往沙发上一甩,跟我说:妈妈,猜个谜语吧?见我点头,儿子就说出了谜面:两口井,一样深。跳进去,齐腰身。小儿科一个。我佯装不知,答:是水桶?儿子把小脑袋……浙江一妈妈为让女儿长高,每天逼其跳绳3000个长不高你自己后近日,浙江一名女子带13岁的女儿到医院就诊,女孩因为跳绳的原因,导致膝盖疼痛。经过检查后,医生确诊女孩是患上了胫骨结节骨骺炎。这一结果让女子后悔不迭,为自己的愚蠢悔恨不已。……中小学课后服务全覆盖,学生喊累教师疲惫,好教育并非在校空耗时在中小学课后服务全覆盖的要求下,自九月份开学以来,各地中小学的课后服务紧锣密鼓、轰轰烈烈地全面开展起来。令人不解的是,这项服务开展不久,很多参加课后服务的学生却叫苦喊累,而参加……太阳有毒防晒要从娃娃抓起!进入五月,夏天的脚步也越来越近。夏天毒辣的阳光很容易晒黑皮肤,这是因为过强的紫外线会破坏皮肤表层细胞,使大量黑色素沉积在表皮层中。长期暴晒还可能造成皮肤发炎、晒伤,甚至引发皮肤……
友情链接:易事利快生活快传网聚热点七猫云快好知快百科中准网快好找文好找中准网快软网