A以下选项中,当x为大于1的奇数时,v3大于2v2,是可能的,但是是如何得到的呢,希望列个式子解释一下,谢谢啦!


大家好我是荟网的Sara,非常感谢夶家关注这一期的荟网专访荟网会每周为大家更新一篇访谈类文章,我们会为您邀请到跨境电商圈中的大卖或者荟员卖家中的佼佼者为夶家分享他们的在跨境路上的成功经验

今天我们为大家邀请到的是荟员Bruce,来为大家分享他做欧洲站的心得以及前段时间大家都很关注的WEEE認证问题

       荟网Sara:据说全段时间德国站很多产品因为WEEE认证的问题产品被暂停销售,您可以具体讲一下这个情况

 荟员Bruce:德国站其实这个规萣欧盟05年就有了,现在英国、意大利、法国、西班牙这些国家其实都是有的但只是德国现在要求特别严格,特别是今年前段时间才知噵,德国从去年已经开始抓这个认证我跟一个供应商聊天,他说去年就有客户也是因为这个原因产品被下架了但是去年只是需要工厂囿这个认证,提供证书就能过今年必须是你自己去注册。我们去问了后台的客服他说必须要有德国的注册号,才能让你的listing恢复我已經有两个产品被下架了,销量不是很大的两个但我现在主要是怕影响到我主力在卖的产品,因为都是带电器的所以我就赶紧去办了。

 薈员Bruce:我英国没怎么做我现在做德国跟意大利站点。我做意大利站真  的是偶尔的本来是不想不打算做意大利站的,主要精力都是放在德国的但是我发现意大利突然有一两个产品,每个月每天都能出单每天出单、每天出单还越出越多。对好意外的然后再着重去看,發现意大利有些产品还是能够做的有有些产品你一天卖个三五个就可以排到小类的前五名了。

 荟员Bruce:我是觉得意大利站点有一个好处呮要你产品合适的话,意大利人是有一定消费能力的只是说你的产品合不合他的胃口。我发现母婴类的产品意大利其实还可以的,有利润出单情况也不错。还有小孩的玩具也不错、时尚类的产品也不错意大利父母给小孩是蛮舍得花钱的。我账户经理跟我说饰品类的產品需要我去留意,这个站点一做活动销量非常大。他前两天打电话跟我说叫我去留意这一个品类,我才去想我之前做意大利站点我只是着重注意小孩用的产品。但是确实意大利站点是不错的我根本没有怎么去打理,知识listing同步过去了然后就发现不停的每天都有絀单,连站内广告都不做的后来我一看销量不错,挂个小广告一天花费个5-10欧,一天营业额能够做到差不多一千多欧

 荟员Bruce:因为我现茬重心在欧洲站点,我觉得欧洲站点如果账号不是时间很久的第一个还是要注意合规经营的,像税务、相关的证书你自己的产品需要什么证书要了解清楚,不然的话旺季大批量发过去出问题被关掉了,这是最惨的我觉得其实亚马逊我回过头来看走自己踩过的这么多坑,然后看到我朋友的经营真的还是要回到一个做生意很本质的东西,卖什么东西给人家这个才是真正的最最关键的还是核心的东西僦是产品。

最烦的就是那种质量产品质量不好的,真的是会被售后拖死特别是做欧洲德国的卖家来说,我觉得最重要第一个是合规苐二个你产品质量必须是过关的。如果一看到退货率太高的话你基本上在德国做不起来。德国人他真的是很严谨的他未必会给你留差評啊或者怎么样,但是他不满意就会退货这个就很麻烦了。而且有很多买家他拿很专业的设备测试你的产品看是否符合你的产品描述。比如你的这个产品太阳能灯因为光线暗下来灯晚上会亮,他就拿流明器去测试比如说你这个产品应该在外界的光为80流明的时候必须煷,如果产品不能达到你的这个产品就是不合格的,他就说你不合格就会退货。我有一个产那个客户买回去了然后他就拿专业的设備,它可以无聊到自己拿个秒表在那里数看你的产品一分钟运转多少次,一个小时是怎么运转他给你去测试。你经过他这么测试反洏会觉得这个产品还是蛮OK的,有些数据反而他测试的比我自己弄的还准确测试后如果他觉得好的话,他也一定会发出来告诉大家这个产品经过测试是怎么样的

所以说我们能够想得到的合规是第一位侧,VAT也是一定要做的前段时间WEEE证书抓的很严,一定要去做的能够想得箌认证全都要去做。有些产品你卖了一年你都以为没事,结果我前两天就有产品被下架因为这WEEE证书的问题个被下架了。那个产品我卖叻一年多了一直都没什么事的,突然之间就被下架了所以我们觉得做跨境电商这个行业还是全球性的一个趋势,还是有生存空间和很夶的利润空间的

荟网Sara:好的非常感Bruce的分享,我们今天就先聊到这里同时也希望荟网能帮助更多的荟员卖家。

感恩一路上有您的陪伴願荟网成为您跨境路上的一盏长明灯,在迷雾中指引您一路前行你专注产品,我们专注推广下期再见。

文章为作者独立观点不代表AMZ123竝场。如有侵权请联系我们。

除了C端我们汽配类目在B端的体量也不差,甚至很多客户在亚马逊上比我们做得好而且是好很多。经常昰我们每天FBA的出货量只有客户的十分之一所以很多时候大家根本不用太过于担心你的供应商跟你去抢市场,因为大家的竞争焦点不在一個维度上的你的重心在零售,供应商的重心在批发早两天的文章还说过我这两年的主要精力放在了C端,B2B的客户基本没跟过没精力也沒时间。如果不是老客户来找我抱怨真的没想到团队的问题已经有点严重了。美国的汽车市场是全球最大的这个大家都知道,改装车嘚文化非常浓厚这一点在上个礼拜的文章也说过。美国人几乎家家户户都有一辆皮卡车被称之为汽车上的民族,也是不无道理的所鉯二手车市场和汽车零部件的市场很大。和别的产品不同尽管我们几个都是做亚马逊出身的,但是在汽配这类产品上我们自己做的远遠不如别的产品,例如家居类、美容类、消费电子类我们有过进入过大类前三的经历,但是汽配类还真没有得益于我们的海外仓,汽配类在线下比很多电子商务平台都要做得好很多客户都是直接发个邮件过来要哪些货,然后直接在PayPal上转钱过了然后我们安排海外仓发貨。有一些是个人消费但是更多的是在社区里面的工具店小老板找我们要货,那种经常聚焦了不少汽车改装爱好者的小店有一个开这樣汽车修理店的客户,时不时的进一些改装车的工具套组一个月几十套这样子吧。有好的产品我也推荐给他试用一下他的量不多,但昰我也不急就当是培养客户了。上个月底这个客户联系上我要一小批耗材,数量不多我就跟发货的同事说这个事就忘记了。那次几忝之后客户找到我说货发少 ,我马上安排管发货的同事去查怎么回事原来是把价格给搞错了,本来来是要批发价给他的但是海外仓嘚同事按照零售价给了他。客户以为我们欺骗了他 语气一度很恼火,我只能是连连道歉客户也表示不再追究,把货补发就行了又安排了海外仓补货,这次我再三跟发货的同事说一定要补足数量包装要好,按时发货给他没想到几天后客户在fb上简直要气炸了,就差点說我是骗子了他直接把发货的数量拍给了我,数量要比原来的少了一倍我愣了,以为是自己交代过程出了问题就仔细的检查了和发貨同事的聊天记录,我再三检查自己的说的话数量、产品规格、发货日期,没错啊发货的同事还是不用心。没办法只能是再三跟客戶道歉,直接给客户退款在我道歉了很长一段时间之后,客户才回了我信息还给了个建议,让我们把发货的同事给解雇了因为这件倳情很有可能影响他以后我们的合作。我确信是我们的管理出了问题在对待客户的态度上出了问题。这是一个很可怕的信号B端的客户鈈像我们做B2C用折扣券换回来的那些客户,能成功开发一个B端客户的话说不定能保持很多年的业务关系。C端用几美金换回来的那些就难说叻人家换掉你是0成本,B2B的客户换个成熟的供应商的话成本还是挺大的,至少信任期也要不短时间吧很多时候,客户是被我们自己人給赶跑的但是我们电商人都还不明白。微商圈之前电商圈其实就已经抱团成风,现在的跨境圈抱团也是很常见如果是一个新手,从零怎么学写listing开始的话那应该需要多和通常交流,交流选品、采购、运营优化、成本节流等等前辈的一个指导,很多时候真的可以解决佷多新手的迷茫销量上去了之后,我们不应该泡在同行圈里面去了我们需要去倾听、改进用户给的建议,多和其他行业的高手交流哆跨境学习别的行业高手。但是跨境圈给我的感觉就是人人都怕别人知道自己是做什么产品的总是担心别人剽窃自己的成果,即使参加過很多所谓的学习会议也不过沉浸在自我封闭的小圈子里自嗨,大大的限制了自己的想象能力天天都是跟同行交流,别人就会把自己嘚核心竞争力告诉你那不过是意味着你把重心放在了同行身上,而不是放在了用户身上别担心我说得不对,就以下一点就能检验你昰不是这样了。每次听到别人爆单或是挣了多少钱的时候,是不是第一时间就想加别人微信请教别人是做什么产品的,怎么做的有這样的时间,为什么不去找一下给你差评的客户到底为什么给你差评呢?盲目的模仿同行说明你已经丢失了自己的定位,没得救了突破点往往是在使用人手上。我们日本站在卖的一款美容仪说实在的,这款产品外表看起很普通大家都没什么竞争力。但是我们的产品投放市场一个多月之后现在大半年过去了,同行没对手就算对方用了和我们一模一样的图片,刷单不计成本3个礼拜后还是被我们擠下去。因为在上线之前研究了这款产品top100的所有差评,客户最大抱怨就是边角太锋利了,一不小心就割手了然后发出了大概是5000封使鼡意见反馈征集信,得出的结论也是差不多就让工厂做了个小小的改进,并申请了专利这款产品我们在日本站到现在都还是牢牢的霸占着主关键词第一的位置。而我们的运营和同行交流的时候都是说应该怎么发FB、怎么吸引粉丝就行了。自己听了都觉得不靠谱同行是開车时的后视镜,偶然看一下就行了一定要把主要的精力放在你的正前方,因为你的客户在前面一款新的产品,在一开始是能够靠营銷驱动给你带去大量的流量的。但是在第一批客户使用了之后肯定是靠用户口碑去驱动的,我们内部也叫做产品基因驱动如果这个時候不重视客户的意见,不及时改进产品那么在后面推广的会越来越吃力,前面挣的钱也会全部给吐出来我们去年有一款蓝牙类的产品,最好的时候是在大类的98名一度风光无限,运营以为可以登上人生的巅峰 继续往前冲进大类的前三。没想到短暂的巅峰一瞬而过受限于工厂的技术问题,一直没办法去改进差评越来越多,后面只能是忍痛放弃了那款产品了给自己打个小广告我准备了本《内容营銷》的电子书,指导你在移动互联网时代如何通过创造优质的内容、在哪些渠道去推广给你的产品带来更多优质的客户电子书里面有我這么多年一直在用的文案框架,只要你不是文盲都可以套用。想要的小伙伴可以邀请3个好友关注我微信公众号(gkw1688 茶客玖玖)或者直接加我微信号:qq 支付128元领取。应该聚焦价值认知来源于不同的位置内容营销实例分析这个旺季,你是不是又少挣了几十万跨境电商内容营銷:主动参与

杭州跨境电子商务协会点击上方蓝字关注一键收听最新跨境资讯》》》点击收听本期音频可以听的跨境电商新闻资讯,无論你是在开车、健身还是在商务洽谈欢迎打开跨境电商新闻联播。一键收听最新跨境资讯2018年12月27日跨境电商新闻联播跨界、跨境、跨越,沟通、服务、创新大家好!今天是2018年12月27日,星期四欢迎收听跨境电商新闻联播。国内新闻个人单日跨境交易超20万要报送央行元旦之後个人使用第三方支付机构单日现金收支达到5万块钱以上,或境内转账50万元亦或者跨境转账20万元以上,支付机构都要向央行提交大额茭易报告同时,互联网金融机构也要上报5万元以上的大额现金交易业内人士指出,新规是为了反洗钱和反恐怖融资的需要不会影响個人和企业的正常账户交易。(北京青年报)阿里国际站启动“数字化出海”计划打造外贸商业操作系统阿里国际站今日宣布启动“数芓化出海”计划,帮中小出口企业开源节流和获得更多订单该计划是一揽子的数字化产品、工具和服务,覆盖了跨境贸易所有环节核惢是围绕买卖双方精准匹配、品牌营销、信用担保、支付金融、基础物流和跨境供应链等环节,对既有产品和服务矩阵进行全面数字化升級(雨果网)浙江省快递业务量突破百亿件大关从浙江省邮政管理局获悉,根据国家邮政局全国快递业数据监测系统显示浙江省快递業务量(发件量)突破100亿件大关。目前浙江全省的快递乡镇网点覆盖率已经达到100%,今年该省农村地区快递业务量超18亿件带动全省农产品销售额1000亿元以上。(新华网)税务总局:“个人所得税”App专项附加扣除信息填报功能12月31日投用从国家税务总局了解到税务总局开发的“個人所得税”App软件已经上线,广大纳税人可以在主流应用市场或在税务部门官方网站扫二维码下载手机端目前支持实名注册功能,税务蔀门正在抓紧进行校验和压力测试专项附加扣除信息填报功能将在2018年12月31日正式投入使用。(新华社)国际新闻俄罗斯在中国电商平台订單量同比去年翻番近日俄罗斯支付服务商Yandex支付联合阿里巴巴旗下跨境电商平台速卖通,展开了一项针对俄罗斯网购用户的调查结果显礻,2018年12月是去年的两倍之多。数据显示同比2017年12月,俄罗斯用户平均支出增长了12%相比今年其它月份,俄罗斯用户的平均支出金额涨幅则超过20%(亿邦动力)英国海关将严查未提供EORI信息的货件递四方发布关于香港DHL渠道发往英国需提供EORI信息或收件人的Billing Address的通知。通知显示英国海关反映,发现有货件未有提供EORI信息将严格查控。提供EORI信息乃当地海关之法规是必须遵守及配合的。发货人应与收件人提前沟通并确认好EORI信息根据英国海关要求,如发件人未能提供EORI信息就必须提供收件人的Billing Address- 帐单地址。如货件未有按照要求操作不排除会被扣關或退件或销毁等,产生的一切后果及相关费用将由收发件人自行承担(亿邦动力)事业上得寸进尺,生活中不论短长何愁事业无成。今天的跨境电商新闻联播节目播送完了感谢收听。想要获取更多的新闻资讯欢迎关注我们杭州跨境电商协会的微信公众号“cnhcea”,也歡迎各会员单位和行业翘楚为我们提供第一手资讯!下期我们再见!杭州跨境电子商务协会杭州跨境电子商务协会(英文名称:Hangzhou Association缩写HCEA),由阿里巴巴(中国)有限公司、网易(杭州)网络有限公司、浙江电子口岸有限公司、浙江网盛生意宝股份有限公司、浙江点库电子商務有限公司等企业共同发起会员主要有跨境电子商务企业、传统外贸企业、跨境电商服务商、跨境电子商务产业园区、相关行业协会以忣研究机构和其他促进跨境电商发展的单位和个人。协会的行业指导单位为杭州市商务委员会协会会员服务热线:办公电话:0571—入会联系:0571—协会邮箱:apply@Shopify 建站|选品|运营|营销点击“阅读原文”进入WaimaoB2C.com官网查看更多精彩内容

-------- 获取最新资讯 ▲ 点击蓝字关注我们  -------品牌旗舰店是亞马逊已经推出了一年多的模块,但是大家对它的了解可能比较少所以,今天我们来聊聊品牌旗舰店到底是什么呢其实简单来说亚马遜旗舰店就是对你的亚马逊店铺进行店铺装修,我们先来看看普通店铺和品牌旗舰店在前台的区别:▲普通店铺▲品牌旗舰店从上图我们鈳以明显的看出两者的差距:普通卖家的店铺就是普通的listing陈列对买家来说与其在你的店铺里麻木的对比产品,还不如去前台跟别的卖家對比而品牌旗舰店则带给买家全新的购物体验、直观的视觉感受,多页面的设计增加了更多的流量入口增强了买家对产品的可选择性。总的来说就好比杂货铺与购物商场1拥有专属店铺链接可以通过搜索将用户导入店铺这里我们搜索robot vacuum,我们可以发现有品牌旗舰店并且做叻头条广告的卖家他们的店铺是可以直接显示在页面的顶部的(页面左侧、页面下方也会出现)并且还拥有三个listing的展示位。这毫无疑问叒是一大流量入口既流向你的产品又流向你的店铺。同时也能展现你的品牌实力就算买家没有立马点进去,在浏览其他产品的时候也會多看你的产品两眼2设计不同模块对产品进行分类这也是品牌旗舰店的最大优势之一,对产品进行准确的定位分类并辅以生动精美的文芓图片进行描述帮助买家更好的了解产品。亚马逊还提供基础设计模板供卖家使用卖家可以根据需要选择不同模板来展现产品,并且品牌旗舰店在手机端也能展示如此一来买家就可以根据自己的需求,迅速的找到自己想要的产品再进行下单大大提高的产品的转化率3展示品牌形象买家对产品的第一印象一般都是图片给予的,通过listing的图片描述、A+ Page的风格、设计水平来初步断定卖家水准也就是所谓的先从外表看人。但listing的图片终究只是展示一款产品而品牌旗舰店无疑更能诠释你的店铺形象。挑选合适自己的框架模板更好的展示自己的店鋪风格。也可以在自己的品牌旗舰店中讲诉自己的品牌故事这毫无疑问是一项加分项,增强顾客粘度外国人是有品牌忠诚度的,重视企业文化 4拥有专属的数据报表在大数据时代,数据即是金钱在亚马逊上,每一份数据报表都代表着一条运营思路拥有品牌旗舰店卖镓可以在后台看到:查看次数(按来源)、访问量(按来源)等,可以帮你更好的了解你的销售来源以及流量来源5 专属分享按钮买家可鉯通过按钮分享到Facebook、Twitter等社交媒体。分享是每个人的天性给朋友分享自己找到的好的店铺,或者小小的炫耀一把自己的眼光品味这是外國人很喜欢做的。因此培养好顾客再通过此按钮你可以更好的进行站外引流。另外买家也可以通过“关注”按钮来关注你的店铺,以獲取你的店铺的更新信息以及其他动态那么如何申请品牌旗舰店呢?首先有几个要求:1. 店铺好评分数不得低于4.7分2. 卖家店铺的活动状态要歭续30天以上3. 需要先通过品牌备案2.0操作流程:1. 在亚马逊后台选择店铺以下选项中,当x为大于1的奇数时卡2.点击【管理店铺】并选择您的品牌名稱。3.点击【创建店铺】4.上传【品牌徽标】一般400x400的分辨率最佳5.输入【品牌描述】,简要的叙述店铺或者商品该描述有一定的搜索权重。品牌化必然是跨境电商发展的趋势之一Anker、大疆无疑是中国跨境电商的成功案例。他们通过发掘顾客痛点来打造产品再冠上自己的品牌,每一次都吸引一大波粉丝长久下来也就确立了自己品牌在人们心中的地位。拥有好的产品只是第一步只有品牌才能走向国际,带来源源不断的单量和全球声誉因此小编在这提醒大家有条件的赶紧开始吧,还差一点的也要努力达到条件~【往期原创精选】美工偷图遇箌图片侵权要怎么处理?用这5个步骤打造一封高质量的改差评邮件!高效降低10%的FBA成本堵住每一道烧钱关口

跨境者商学院资讯、技巧从未洳此贴近关注滥用变体关系一直都是亚马逊卖家惯用的“黑科技”之一,自从亚马逊开始严打各种擦边球和违规操作之后本来玩的一套┅套的黑科技卖家们一下子就原形毕露了。前面我们也报道过一个滥用变体关系删差评的方法被官方查封的事件大家可以通过下面链接進入回顾。【重磅】亚马逊Review再更新!这个移除差评手段被封杀今天小分身要和大家讲的同样也是滥用变体关系结果现在被亚马逊秋后算账嘚故事不过这个功能比较少见,大家可以先了解一下——Merge一般情况下我们用到合并变体的时候,尽管两个变体都被并到了一个listing下尽管新政之后他们现在可以共享Review,但是在后台这两个产品依然有着自己独立的Asin而本次被爆出亚马逊严打的merge功能,本来使用于亚马逊合并平囼上完全相同的产品来减少listing方便顾客的因为合并的完全就是同一个东西,所以通过merge功能合并的变体就只有一个ASIN(这个操作只能由客服来莋同时有品牌备案的产品也只能有品牌持有方才能提出合并)。(合并的要求必须是两个一致的产品)大家知道了这个merge的功能之后,峩们就要说说智慧的中国卖家们是怎么把这个不起眼的功能玩出花样的正常合并变体后,两个变体仍然是单独的ASIN所以库存也是互不相通的。但是通过merge功能合并到一起变体只有一个ASIN这样原本属于两个不同变体的库存就合到了一起,转移库存的目的就达到了并且还不需偠海外仓换标等麻烦又费钱的操作。这样就能用自己流量排名表现好的变体来消化自己的其他库存但是这个操作依然违反了亚马逊的规萣,并且还是属于后果相当严重的滥用变体关系会被冻结账号程度的严重。所以这么操作的卖家大多在今天收到了亚马逊的警告邮件夶概内容就是亚马逊检测到该卖家有多次合并ASIN的操作,进而默认卖家上传了多个同样的产品(只有这样才能用Merge来合并)特地来警告卖家,为了消费者的体验请一个产品只上传一个页面亚马逊现在的大风向已经容不下黑科技卖家生存的缝隙了,所有违规操作都有被平台找仩的一天倒是非常像之前Alice老师说的,亚马逊就爱在旺季之后算账(Alice老师分享于卖家之家)现在旺季结束,亚马逊也空出手来收拾收拾岼台上那些违规和擦边球了当下黑科技和刷单派卖家还是低调为好,万一哪天被亚马逊查到可是翻身的机会都没有当然接下来对于上媔两种卖家来说,打压的氛围将会一直持续还是另谋出路看看隔壁精细化运营卖家的盛况吧。还有疑问的同学扫码咨询小分身哦另外还囿每日都会分享干货和资讯的卖家大家庭等你加入私聊我拉你进群~平台寒冬中抱团取暖活下去,才有未来文章来源:跨境者商学院往期精彩点下方链接回顾【黑马】它是如何在亚马逊红海类目中两个月屠榜的被价之链刷屏?你吃透上市大卖这波操作了吗最速!2018亚马逊嫼五战报整合后的亚马逊广告,你看懂了吗

}

锁是计算机协调多个进程或线程並发访问某一资源的机制在数据库中,除传统的计算资源(如CPU、RAM、I/O等)的争用以外数据也是一种供许多用户共享的资源。如何保证数據并发访问的一致性、有效性是所有数据库必须解决的一个问题锁冲突也是影响数据库并发访问性能的一个重要因素。从这个角度来说锁对数据库而言显得尤其重要,也更加复杂本章我们着重讨论MySQL锁机制的特点,常见的锁问题以及解决MySQL锁问题的一些方法或建议。

相對其他数据库而言MySQL的锁机制比较简单,其最显著的特点是不同的存储引擎支持不同的锁机制比如,MyISAM和MEMORY存储引擎采用的是表级锁(table-level locking);BDB存储引擎采用的是页面锁(page-level locking)但也支持表级锁;InnoDB存储引擎既支持行级锁(row-level locking),也支持表级锁但默认情况下是采用行级锁。

MySQL这3种锁的特性可大致归纳如下

开销、加锁速度、死锁、粒度、并发性能

从上述特点可见,很难笼统地说哪种锁更好只能就具体应用的特点来说哪種锁更合适!仅从锁的角度来说:表级锁更适合于以查询为主,只有少量按索引条件更新数据的应用如Web应用;而行级锁则更适合于有大量按索引条件并发更新少量不同数据,同时又有并发查询的应用如一些在线事务处理(OLTP)系统。这一点在本书的“开发篇”介绍表类型嘚选择时也曾提到过。下面几节我们重点介绍MySQL表锁和 InnoDB行锁的问题由于BDB已经被InnoDB取代,即将成为历史在此就不做进一步的讨论了。

MyISAM存储引擎只支持表锁这也是MySQL开始几个版本中唯一支持的锁类型。随着应用对事务完整性和并发性要求的不断提高MySQL才开始开发基于事务的存儲引擎,后来慢慢出现了支持页锁的BDB存储引擎和支持行锁的InnoDB存储引擎(实际 InnoDB是单独的一个公司现在已经被Oracle公司收购)。但是MyISAM的表锁依然昰使用最为广泛的锁类型本节将详细介绍MyISAM表锁的使用。

如果Table_locks_waited的值比较高则说明存在着较严重的表级锁争用情况。

MySQL表级锁的锁模式

可见对MyISAM表的读操作,不会阻塞其他用户对同一表的读请求但会阻塞对同一表的写请求;对 MyISAM表的写操作,则会阻塞其他用户对同一表的读和寫操作;MyISAM表的读操作与写操作之间以及写操作之间是串行的!根据如表20-2所示的例子可以知道,当一个线程获得对一个表的写锁后只有歭有锁的线程可以对表进行更新操作。其他线程的读、写操作都会等待直到锁被释放为止。

当前session对锁定表的查询、更新、插入操作都可鉯执行:

其他session对锁定表的查询被阻塞需要等待锁被释放:

Session2获得锁,查询返回:

MyISAM在执行查询语句(SELECT)前会自动给涉及的所有表加读锁,茬执行更新操作(UPDATE、DELETE、INSERT等)前会自动给涉及的表加写锁,这个过程并不需要用户干预因此,用户一般不需要直接用LOCK TABLE命令给MyISAM表显式加锁在本书的示例中,显式加锁基本上都是为了方便而已并非必须如此。

给MyISAM表显示加锁一般是为了在一定程度模拟事务操作,实现对某┅时间点多个表的一致性读取例如,有一个订单表orders其中记录有各订单的总金额total,同时还有一个订单明细表order_detail其中记录有各订单每一产品的金额小计 subtotal,假设我们需要检查这两个表的金额合计是否相符可能就需要执行如下两条SQL:

这时,如果不先给两个表加锁就可能产生錯误的结果,因为第一条语句执行过程中order_detail表可能已经发生了改变。因此正确的方法应该是:

要特别说明以下两点内容。

?  上面的例子茬LOCK TABLES时加了“local”以下选项中,当x为大于1的奇数时其作用就是在满足MyISAM表并发插入条件的情况下,允许其他用户在表尾并发插入记录有关MyISAM表的並发插入问题,在后面的章节中还会进一步介绍

?  在用LOCK TABLES给表显式加表锁时,必须同时取得所有涉及到表的锁并且MySQL不支持锁升级。也就昰说在执行LOCK TABLES后,只能访问显式加锁的这些表不能访问未加锁的表;同时,如果加的是读锁那么只能执行查询操作,而不能执行更新操作其实,在自动加锁的情况下也基本如此MyISAM总是一次获得SQL语句所需要的全部锁。这也正是MyISAM表不会出现死锁(Deadlock Free)的原因

在如表20-3所示的唎子中,一个session使用LOCK TABLE命令给表film_text加了读锁这个session可以查询锁定表中的记录,但更新或访问其他表都会提示错误;同时另外一个session可以查询表中嘚记录,但更新就会出现锁等待

当前session可以查询该表记录

其他session也可以查询该表的记录

当前session不能查询没有锁定的表

其他session可以查询或者更新未鎖定的表

当前session中插入或者更新锁定的表都会提示错误:

其他session更新锁定表会等待获得锁:

Session获得锁,更新操作完成:

当使用LOCK TABLES时不仅需要一次鎖定用到的所有表,而且同一个表在SQL语句中出现多少次,就要通过与SQL语句中相同的别名锁定多少次否则也会出错!举例说明如下。

(1)对actor表获得读锁:

(2)但是通过别名访问会提示错误:

(3)需要对别名分别锁定:

(4)按照别名的查询可以正确执行:

上文提到过MyISAM表的读囷写是串行的但这是就总体而言的。在一定条件下MyISAM表也支持查询和插入操作的并发进行。

MyISAM存储引擎有一个系统变量concurrent_insert专门用以控制其並发插入的行为,其值分别可以为0、1或2

在如表20-4所示的例子中,session_1获得了一个表的READ LOCAL锁该线程可以对表进行查询操作,但不能对表进行更新操作;其他的线程(session_2)虽然不能对表进行删除和更新操作,但却可以对该表进行并发插入操作这里假设该表中间不存在空洞。

当前session不能对锁定表进行更新或者插入操作:

其他session可以进行插入操作但是更新会等待:

当前session解锁后可以获得其他session插入的记录:

Session2获得锁,更新操作唍成:

可以利用MyISAM存储引擎的并发插入特性来解决应用中对同一表查询和插入的锁争用。例如将concurrent_insert系统变量设为2,总是允许并发插入;同時通过定期在系统空闲时段执行 OPTIMIZE TABLE语句来整理空间碎片,收回因删除记录而产生的中间空洞有关OPTIMIZE TABLE语句的详细介绍,可以参见第18章中“两個简单实用的优化方法”一节的内容

前面讲过,MyISAM存储引擎的读锁和写锁是互斥的读写操作是串行的。那么一个进程请求某个 MyISAM表的读鎖,同时另一个进程也请求同一表的写锁MySQL如何处理呢?答案是写进程先获得锁不仅如此,即使读请求先到锁等待队列写请求后到,寫锁也会插到读锁请求之前!这是因为MySQL认为写请求一般比读请求要重要这也正是MyISAM表不太适合于有大量更新操作和查询操作应用的原因,洇为大量的更新操作会造成查询操作很难获得读锁,从而可能永远阻塞这种情况有时可能会变得非常糟糕!幸好我们可以通过一些设置来调节MyISAM

虽然上面3种方法都是要么更新优先,要么查询优先的方法但还是可以用其来解决查询相对重要的应用(如用户登录系统)中,讀锁等待严重的问题

另外,MySQL也提供了一种折中的办法来调节读写冲突即给系统参数max_write_lock_count设置一个合适的值,当一个表的读锁达到这个值后MySQL就暂时将写请求的优先级降低,给读进程一定获得锁的机会

上面已经讨论了写优先调度机制带来的问题和解决办法。这里还要强调一點:一些需要长时间运行的查询操作也会使写进程“饿死”!因此,应用中应尽量避免出现长时间运行的查询操作不要总想用一条SELECT语呴来解决问题,因为这种看似巧妙的SQL语句往往比较复杂,执行时间较长在可能的情况下可以通过使用中间表等措施对SQL语句做一定的“汾解”,使每一步查询都能在较短时间完成从而减少锁冲突。如果复杂查询不可避免应尽量安排在数据库空闲时段执行,比如一些定期统计可以安排在夜间执行

InnoDB与MyISAM的最大不同有两点:一是支持事务(TRANSACTION);二是采用了行级锁。行级锁与表级锁本来就有许多不同之处另外,事务的引入也带来了一些新问题下面我们先介绍一点背景知识,然后详细讨论InnoDB的锁问题

事务是由一组SQL语句组成的逻辑处理单元,倳务具有以下4个属性通常简称为事务的ACID属性。

l         一致性(Consistent):在事务开始和完成时数据都必须保持一致状态。这意味着所有相关的数据規则都必须应用于事务的修改以保持数据的完整性;事务结束时,所有的内部数据结构(如B树索引或双向链表)也都必须是正确的

l         隔離性(Isolation):数据库系统提供一定的隔离机制,保证事务在不受外部并发操作影响的“独立”环境执行这意味着事务处理过程中的中间状態对外部是不可见的,反之亦然

银行转帐就是事务的一个典型例子。

2.并发事务处理带来的问题

相对于串行处理来说并发事务处理能夶大增加数据库资源的利用率,提高数据库系统的事务吞吐量从而可以支持更多的用户。但并发事务处理也会带来一些问题主要包括鉯下几种情况。

Update):当两个或多个事务选择同一行然后基于最初选定的值更新该行时,由于每个事务都不知道其他事务的存在就会发苼丢失更新问题--最后的更新覆盖了由其他事务所做的更新。例如两个编辑人员制作了同一文档的电子副本。每个编辑人员独立地更妀其副本然后保存更改后的副本,这样就覆盖了原始文档最后保存其更改副本的编辑人员覆盖另一个编辑人员所做的更改。如果在一個编辑人员完成并提交事务之前另一个编辑人员不能访问同一文件,则可避免此问题

l  脏读(Dirty Reads):一个事务正在对一条记录做修改,在這个事务完成并提交前这条记录的数据就处于不一致状态;这时,另一个事务也来读取同一条记录如果不加控制,第二个事务读取了這些“脏”数据并据此做进一步的处理,就会产生未提交的数据依赖关系这种现象被形象地叫做"脏读"。

l  不可重复读(Non-Repeatable Reads):一个事务在讀取某些数据后的某个时间再次读取以前读过的数据,却发现其读出的数据已经发生了改变、或某些记录已经被删除了!这种现象就叫莋“不可重复读”

l  幻读(Phantom Reads):一个事务按相同的查询条件重新读取以前检索过的数据,却发现其他事务插入了满足其查询条件的新数据这种现象就称为“幻读”。

在上面讲到的并发事务处理带来的问题中“更新丢失”通常是应该完全避免的。但防止更新丢失并不能單靠数据库事务控制器来解决,需要应用程序对要更新的数据加必要的锁来解决因此,防止更新丢失应该是应用的责任

“脏读”、“鈈可重复读”和“幻读”,其实都是数据库读一致性问题必须由数据库提供一定的事务隔离机制来解决。数据库实现事务隔离的方式基本上可分为以下两种。

l  一种是在读取数据前对其加锁,阻止其他事务对数据进行修改

l  另一种是不用加任何锁,通过一定机制生成一個数据请求时间点的一致性数据快照(Snapshot)并用这个快照来提供一定级别(语句级或事务级)的一致性读取。从用户的角度来看好像是数據库可以提供同一数据的多个版本,因此这种技术叫做数据多版本并发控制(MultiVersion Concurrency Control,简称MVCC或MCC)也经常称为多版本数据库。

数据库的事务隔離越严格并发副作用越小,但付出的代价也就越大因为事务隔离实质上就是使事务在一定程度上 “串行化”进行,这显然与“并发”昰矛盾的同时,不同的应用对读一致性和事务隔离程度的要求也是不同的比如许多应用对“不可重复读”和“幻读”并不敏感,可能哽关心数据并发访问的能力

为了解决“隔离”与“并发”的矛盾,ISO/ANSI SQL92定义了4个事务隔离级别每个级别的隔离程度不同,允许出现的副作鼡也不同应用可以根据自己的业务逻辑要求,通过选择不同的隔离级别来平衡 “隔离”与“并发”的矛盾表20-5很好地概括了这4个隔离级別的特性。

读数据一致性及允许的并发副作用

最低级别只能保证不读取物理上损坏的数据

最后要说明的是:各具体数据库并不一定完全實现了上述4个隔离级别,例如Oracle只提供Read committed和Serializable两个标准隔离级别,另外还提供自己定义的Read only隔离级别;SQL Server除支持上述ISO/ANSI SQL92定义的4个隔离级别外还支持┅个叫做“快照”的隔离级别,但严格来说它是一个用MVCC实现的Serializable隔离级别MySQL 支持全部4个隔离级别,但在具体实现时有一些特点,比如在一些隔离级别下是采用MVCC一致性读但某些情况下又不是,这些内容在后面的章节中将会做进一步介绍

可以通过检查InnoDB_row_lock状态变量来分析系统上嘚行锁的争夺情况:

然后就可以用下面的语句来进行查看:

监视器可以通过发出下列语句来停止查看:

STATUS的显示内容中,会有详细的当前锁等待的信息包括表名、锁类型、锁定记录的情况等,便于进行进一步的分析和问题的确定打开监视器以后,默认情况下每15秒会向日志Φ记录监控的内容如果长时间打开会导致.err文件变得非常的巨大,所以用户在确认问题原因之后要记得删除监控表以关闭监视器,或者通过使用“--console”以下选项中,当x为大于1的奇数时来启动服务器以关闭写日志文件

InnoDB的行锁模式及加锁方法

InnoDB实现了以下两种类型的行锁。

l  共享锁(S):允许一个事务去读一行阻止其他事务获得相同数据集的排他锁。

l  排他锁(X):允许获得排他锁的事务更新数据阻止其他事务取得楿同数据集的共享读锁和排他写锁。

另外为了允许行锁和表锁共存,实现多粒度锁机制InnoDB还有两种内部使用的意向锁(Intention Locks),这两种意向鎖都是表锁

l  意向共享锁(IS):事务打算给数据行加行共享锁,事务在给一个数据行加共享锁前必须先取得该表的IS锁

l  意向排他锁(IX):倳务打算给数据行加行排他锁,事务在给一个数据行加排他锁前必须先取得该表的IX锁

上述锁模式的兼容情况具体如表20-6所示。

InnoDB行锁模式兼嫆性列表

如果一个事务请求的锁模式与当前的锁兼容InnoDB就将请求的锁授予该事务;反之,如果两者不兼容该事务就要等待锁释放。

意向鎖是InnoDB自动加的不需用户干预。对于UPDATE、DELETE和INSERT语句InnoDB会自动给涉及数据集加排他锁(X);对于普通SELECT语句,InnoDB不会加任何锁;事务可以通过以下语句顯示给记录集加共享锁或排他锁

用SELECT ... IN SHARE MODE获得共享锁,主要用在需要数据依存关系时来确认某行记录是否存在并确保没有人对这个记录进行UPDATE戓者DELETE操作。但是如果当前事务也需要对该记录进行更新操作则很有可能造成死锁,对于锁定行记录后需要进行更新操作的应用应该使鼡SELECT... FOR UPDATE方式获得排他锁。

在如表20-7所示的例子中使用了SELECT ... IN SHARE MODE加锁后再更新记录,看看会出现什么情况其中actor表的actor_id字段为主键。

其他session仍然可以查询记錄并也可以对该记录加share mode的共享锁:

当前session对锁定的记录进行更新操作,等待锁:

其他session也对该记录进行更新操作则会导致死锁退出:

获得鎖后,可以成功更新:

其他session可以查询该记录但是不能对该记录加共享锁,会等待获得锁:

当前session可以对锁定的记录进行更新操作更新后釋放锁:

其他session获得锁,得到其他session提交的记录:

InnoDB行锁是通过给索引上的索引项加锁来实现的这一点MySQL与Oracle不同,后者是通过在数据块中对相应數据行加锁来实现的InnoDB这种行锁实现特点意味着:只有通过索引条件检索数据,InnoDB才使用行级锁否则,InnoDB将使用表锁!

在实际应用中要特別注意InnoDB行锁的这一特性,不然的话可能导致大量的锁冲突,从而影响并发性能下面通过一些实际例子来加以说明。

(1)在不通过索引條件查询的时候InnoDB确实使用的是表锁,而不是行锁

在如表20-9所示的例子中,开始tab_no_index表没有索引:

在如表20 -9所示的例子中看起来session_1只给一行加了排他锁,但session_2在请求其他行的排他锁时却出现了锁等待!原因就是在没有索引的情况下,InnoDB只能使用表锁当我们给其增加一个索引后,InnoDB就呮锁定了符合条件的行如表20-10所示。

(2)由于MySQL的行锁是针对索引加的锁不是针对记录加的锁,所以虽然是访问不同行的记录但是如果昰使用相同的索引键,是会出现锁冲突的应用设计的时候要注意这一点。

虽然session_2访问的是和session_1不同的记录但是因为使用了相同的索引,所鉯需要等待锁:

(3)当表有多个索引的时候不同的事务可以使用不同的索引锁定不同的行,另外不论是使用主键索引、唯一索引或普通索引,InnoDB都会使用行锁来对数据加锁

在如表20-12所示的例子中,表tab_with_index的id字段有主键索引name字段有普通索引:

Session_2使用name的索引访问记录,因为记录没囿被索引所以可以获得锁:

由于访问的记录已经被session_1锁定,所以等待获得锁:

(4)即便在条件中使用了索引字段,但是否使用索引来检索数据是由MySQL通过判断不同执行计划的代价来决定的如果MySQL认为全表扫描效率更高,比如对一些很小的表它就不会使用索引,这种情况下InnoDB將使用表锁而不是行锁。因此在分析锁冲突时,别忘了检查SQL的执行计划以确认是否真正使用了索引。关于MySQL在什么情况下不使用索引嘚详细讨论参见本章“索引问题”一节的介绍。

在下面的例子中检索值的数据类型与索引字段不同,虽然MySQL能够进行数据类型转换但卻不会使用索引,从而导致InnoDB使用表锁通过用explain检查两条SQL的执行计划,我们可以清楚地看到了这一点

例子中tab_with_index表的name字段有索引,但是name字段是varchar類型的如果where条件中不是和varchar类型进行比较,则会对name进行类型转换而执行的全表扫描。

当我们用范围条件而不是相等条件检索数据并请求共享或排他锁时,InnoDB会给符合条件的已有数据记录的索引项加锁;对于键值在条件范围内但并不存在的记录叫做“间隙(GAP)”,InnoDB也会对这個“间隙”加锁这种锁机制就是所谓的间隙锁(Next-Key锁)。

是一个范围条件的检索InnoDB不仅会对符合条件的empid值为101的记录加锁,也会对empid大于101(这些记录并不存在)的“间隙”加锁

InnoDB使用间隙锁的目的,一方面是为了防止幻读以满足相关隔离级别的要求,对于上面的例子要是不使用间隙锁,如果其他事务插入了empid大于100的任何记录那么本事务如果再次执行上述语句,就会发生幻读;另外一方面是为了满足其恢复囷复制的需要。有关其恢复和复制对锁机制的影响以及不同隔离级别下InnoDB使用间隙锁的情况,在后续的章节中会做进一步介绍

很显然,茬使用范围条件检索并锁定记录时InnoDB这种加锁机制会阻塞符合条件范围内键值的并发插入,这往往会造成严重的锁等待因此,在实际应鼡开发中尤其是并发插入比较多的应用,我们要尽量优化业务逻辑尽量使用相等条件来访问更新数据,避免使用范围条件

还要特别說明的是,InnoDB除了通过范围条件加锁时使用间隙锁外如果使用相等条件请求给一个不存在的记录加锁,InnoDB也会使用间隙锁!

这时如果其他session插入empid为102的记录(注意:这条记录并不存在),也会出现锁等待:

由于其他session_1回退后释放了Next-Key锁当前session可以获得锁并成功插入记录:

恢复和复制嘚需要,对InnoDB锁机制的影响

MySQL通过BINLOG录执行成功的INSERT、UPDATE、DELETE等更新数据的SQL语句并由此实现MySQL数据库的恢复和主从复制(可以参见本书“管理篇”的介紹)。MySQL的恢复机制(复制其实就是在Slave Mysql不断做基于BINLOG的恢复)有以下特点

l  一是MySQL的恢复是SQL语句级的,也就是重新执行BINLOG中的SQL语句这与Oracle数据库不哃,Oracle是基于数据库文件块的

l  二是MySQL的Binlog是按照事务提交的先后顺序记录的,恢复也是按这个顺序进行的这点也与Oralce不同,Oracle是按照系统更新号(System Change NumberSCN)来恢复数据的,每个事务开始时Oracle都会分配一个全局唯一的SCN,SCN的顺序与事务开始的时间顺序是一致的

从上面两点可知,MySQL的恢复机淛要求:在一个事务未提交前其他并发事务不能插入满足其锁定条件的任何记录,也就是不允许出现幻读这已经超过了ISO/ANSI SQL92“可重复读”隔离级别的要求,实际上是要求事务要串行化这也是许多情况下,InnoDB要用到间隙锁的原因比如在用范围条件更新记录时,无论在Read Commited或是Repeatable Read隔離级别下InnoDB都要使用间隙锁,但这并不是隔离级别要求的有关InnoDB在不同隔离级别下加锁的差异在下一小节还会介绍。

...(CTAS)”这种SQL语句用户并沒有对source_tab做任何更新操作,但MySQL对这种SQL语句做了特别处理先来看如表20-14的例子。

在上面的例子中只是简单地读 source_tab表的数据,相当于执行一个普通的SELECT语句用一致性读就可以了。ORACLE正是这么做的它通过MVCC技术实现的多版本数据来实现一致性读,不需要给source_tab加任何锁我们知道InnoDB也实现了哆版本数据,对普通的SELECT一致性读也不需要加任何锁;但这里InnoDB却给source_tab加了共享锁,并没有使用多版本数据一致性读技术!

MySQL为什么要这么做呢其原因还是为了保证恢复和复制的正确性。因为不加锁的话如果在上述语句执行过程中,其他事务对source_tab做了更新操作就可能导致数据恢复的结果错误。为了演示这一点我们再重复一下前面的例子,不同的是在session_1执行事务前先将系统变量

此时查看数据,target_tab中可以插入source_tab更新湔的结果这符合应用逻辑:

    可以发现,在BINLOG中更新操作的位置在INSERT...SELECT之前,如果使用这个BINLOG进行数据库恢复恢复的结果与实际的应用逻辑不苻;如果进行复制,就会导致主从数据库不一致!

...”时要给source_tab加锁而不是使用对并发影响最小的多版本数据来实现一致性读。还要特别说奣的是如果上述语句的SELECT是范围条件,InnoDB还会给源表加间隙锁(Next-Lock)

因此,INSERT...SELECT...和 CREATE TABLE...SELECT...语句可能会阻止对源表的并发更新,造成对源表锁的等待洳果查询比较复杂的话,会造成严重的性能问题我们在应用中应尽量避免使用。实际上MySQL将这种SQL叫作不确定(non-deterministic)的SQL,不推荐使用

如果應用中一定要用这种SQL来实现业务逻辑,又不希望对源表的并发更新产生影响可以采取以下两种措施:

?  一是采取上面示例中的做法,将innodb_locks_unsafe_for_binlog嘚值设置为“on”强制MySQL使用多版本数据一致性读。但付出的代价是可能无法用binlog正确地恢复或复制数据因此,不推荐使用这种方式

InnoDB在不哃隔离级别下的一致性读及锁的差异

前面讲过,锁和多版本数据是InnoDB实现一致性读和ISO/ANSI SQL92隔离级别的手段因此,在不同的隔离级别下InnoDB处理SQL时采用的一致性读策略和需要的锁是不同的。同时数据恢复和复制机制的特点,也对一些SQL的一致性读策略和锁策略有很大影响将这些特性归纳成如表20-16所示的内容,以便读者查阅

InnoDB存储引擎中不同SQL在不同隔离级别下锁比较

从表20-16可以看出:对于许多SQL,隔离级别越高InnoDB给记录集加的锁就越严格(尤其是使用范围条件的时候),产生锁冲突的可能性也就越高从而对并发性事务处理性能的影响也就越大。因此我們在应用中,应该尽量使用较低的隔离级别以减少锁争用的机率。实际上通过优化事务逻辑,大部分应用使用Read

对于InnoDB表在绝大部分情況下都应该使用行级锁,因为事务和行锁往往是我们之所以选择InnoDB表的理由但在个别特殊事务中,也可以考虑使用表级锁

?  第一种情况昰:事务需要更新大部分或全部数据,表又比较大如果使用默认的行锁,不仅这个事务执行效率低而且可能造成其他事务长时间锁等待和锁冲突,这种情况下可以考虑使用表锁来提高该事务的执行速度

?  第二种情况是:事务涉及多个表,比较复杂很可能引起死锁,慥成大量事务回滚这种情况也可以考虑一次性锁定事务涉及的表,从而避免死锁、减少数据库因事务回滚带来的开销

当然,应用中这兩种事务不能太多否则,就应该考虑使用MyISAM表了

在InnoDB下,使用表锁要注意以下两点

Server也才能感知InnoDB加的行锁,这种情况下InnoDB才能自动识别涉忣表级锁的死锁;否则,InnoDB将无法自动检测并处理这种死锁有关死锁,下一小节还会继续讨论

TABLES释放表锁。正确的方式见如下语句:

例如如果需要写表t1并从表t读,可以按如下做:

上文讲过MyISAM表锁是deadlock free的,这是因为MyISAM总是一次获得所需的全部锁要么全部满足,要么等待因此鈈会出现死锁。但在InnoDB中除单个SQL组成的事务外,锁是逐步获得的这就决定了在InnoDB中发生死锁是可能的。如表20-17所示的就是一个发生死锁的例孓

因session_2已取得排他锁,等待

在上面的例子中两个事务都需要获得对方持有的排他锁才能继续完成事务,这种循环锁等待就是典型的死锁

发生死锁后,InnoDB一般都能自动检测到并使一个事务释放锁并回退,另一个事务获得锁继续完成事务。但在涉及外部锁或涉及表锁的凊况下,InnoDB并不能完全自动检测到死锁这需要通过设置锁等待超时参数 innodb_lock_wait_timeout来解决。需要说明的是这个参数并不是只用来解决死锁问题,在並发访问比较高的情况下如果大量事务因无法立即获得所需的锁而挂起,会占用大量计算机资源造成严重性能问题,甚至拖跨数据库我们通过设置合适的锁等待超时阈值,可以避免这种情况发生

通常来说,死锁都是应用设计的问题通过调整业务流程、数据库对象設计、事务大小,以及访问数据库的SQL语句绝大部分死锁都可以避免。下面就通过实例来介绍几种避免死锁的常用方法

(1)在应用中,洳果不同的程序会并发存取多个表应尽量约定以相同的顺序来访问表,这样可以大大降低产生死锁的机会在下面的例子中,由于两个session訪问两个表的顺序不同发生死锁的机会就非常高!但如果以相同的顺序来访问,死锁就可以避免

(2)在程序以批量方式处理数据的时候,如果事先对数据排序保证每个线程按固定的顺序来处理记录,也可以大大降低出现死锁的可能

(3)在事务中,如果要更新记录應该直接申请足够级别的锁,即排他锁而不应先申请共享锁,更新时再申请排他锁因为当用户申请排他锁时,其他事务可能又已经获嘚了相同记录的共享锁从而造成锁冲突,甚至死锁具体演示可参见20.3.3小节中的例子。

       (4)前面讲过在REPEATABLE-READ隔离级别下,如果两个线程同时對相同条件记录用SELECT...FOR UPDATE加排他锁在没有符合该条件记录情况下,两个线程都会加锁成功程序发现记录尚不存在,就试图插入一条新记录洳果两个线程都这么做,就会出现死锁这种情况下,将隔离级别改成READ

因为其他session也对该记录加了锁所以当前的插入会等待:

因为其他session已經对记录进行了更新,这时候再插入记录就会提示死锁并退出:

由于其他session已经退出当前session可以获得锁并成功插入记录:

(5)当隔离级别为READ COMMITTED時,如果两个线程都先执行SELECT...FOR UPDATE判断是否存在符合条件的记录,如果没有就插入记录。此时只有一个线程能插入成功,另一个线程会出現锁等待当第1个线程提交后,第2个线程会因主键重出错但虽然这个线程出错了,却会获得一个排他锁!这时如果有第3个线程又来申请排他锁也会出现死锁。

对于这种情况可以直接做插入操作,然后再捕获主键重异常或者在遇到主键重错误时,总是执行ROLLBACK释放获得的排他锁如表20-21所示。

Session_2插入申请等待获得锁:

Session_2获得锁发现插入记录主键重,这个时候抛出了异常但是并没有释放共享锁:

这个时候,如果session_2直接对记录进行更新操作则会抛出死锁的异常:

尽管通过上面介绍的设计和SQL优化等措施,可以大大减少死锁但死锁很难完全避免。洇此在程序设计中总是捕获并处理死锁异常是一个很好的编程习惯。

如果出现死锁可以用SHOW INNODB STATUS命令来确定最后一个死锁产生的原因。返回結果中包括死锁相关事务的详细信息如引发死锁的SQL语句,事务已经获得的锁正在等待什么锁,以及被回滚的事务等据此可以分析死鎖产生的原因和改进措施。下面是一段SHOW INNODB STATUS输出的样例:

本章重点介绍了MySQL中MyISAM表级锁和InnoDB行级锁的实现特点并讨论了两种存储引擎经常遇到的锁問题和解决办法。

对于MyISAM的表锁主要讨论了以下几点:

(1)共享读锁(S)之间是兼容的,但共享读锁(S)与排他写锁(X)之间以及排他寫锁(X)之间是互斥的,也就是说读和写是串行的

(2)在一定条件下,MyISAM允许查询和插入并发执行我们可以利用这一点来解决应用中对哃一表查询和插入的锁争用问题。

(3)MyISAM默认的锁调度机制是写优先这并不一定适合所有应用,用户可以通过设置LOW_PRIORITY_UPDATES参数或在INSERT、UPDATE、DELETE语句中指定LOW_PRIORITY以下选项中,当x为大于1的奇数时来调节读写锁的争用。

(4)由于表锁的锁定粒度大读写之间又是串行的,因此如果更新操作较多,MyISAM表可能会出现严重的锁等待可以考虑采用InnoDB表来减少锁冲突。

对于InnoDB表本章主要讨论了以下几项内容。

在了解InnoDB锁特性后用户可以通过设計和SQL调整等措施减少锁冲突和死锁,包括:

l         给记录集显示加锁时最好一次性请求足够级别的锁。比如要修改数据的话最好直接申请排怹锁,而不是先申请共享锁修改时再请求排他锁,这样容易产生死锁;

l         不同的程序访问一组表时应尽量约定以相同的顺序访问各表,對一个表而言尽可能以固定的顺序存取表中的行。这样可以大大减少死锁的机会;

}

美团每天有百万级的图片产生量运营人员负责相关图片的内容审核,对涉及法律风险及不符合平台规定的图片进行删除操作由于图片数量巨大,人工审核耗时耗力且審核能力有限另外对于不同审核人员来讲,审核标准难以统一且实时变化所以有必要借助机器实现智能审核。

图像智能审核一般是指利用图像处理与机器学习相关技术识别图像内容进而甄别图像是否违规。图像智能审核旨在建立图片自动审核服务由机器自动禁止不苻合规定(负例)的图片类型,自动通过符合规定(正例)的图片类型机器不确定的图片交由人工审核。因此衡量智能审核系统性能嘚指标主要是准确率和自动化率。

通常的自动审核思路是穷举不符合规定的图片(例如水印图、涉黄图、暴恐图、明星脸、广告图等)类型剩下的图片作为正例自动通过。这样带来的问题是对新增的违规内容扩展性不足另外必须等待所有模型构建完毕才能起到自动化过濾的作用。

如果我们能主动挖掘符合规定的图片(例如正常人物图、场景一致图)进行自动通过将正例过滤和负例过滤相结合,这样才能更快起到节省人工审核的作用因此,我们的图像智能审核系统分为图片负例过滤模块和图片正例过滤模块待审图片先进入负例过滤模块判断是否违禁,再进入正例过滤模块进行自动通过剩余机器不确定的图片交由人工审核。整个技术方案如图 1

1 图像智能审核技术方案

负例过滤和正例过滤模块中都会涉及检测、分类和识别等技术而深度学习则是该领域的首选技术。下面将分别以水印过滤、明星脸识別、色情图片检测和场景分类来介绍深度学习在图像智能审核中的应用

基于深度学习的水印检测

为了保护版权和支持原创内容,需要自動检测商家或用户上传的图片中是否包括违禁水印(竞对水印、其他产品的 Logo)与其他类刚体目标不同,水印具有以下特点

线下收集所涉及的主流违禁水印有 20 多类,每一类水印又存在多种样式除此之外,线上存在大量未知类型的水印

水印在图片中位置不固定且较小,主体存在裁切变形并且会存在多个主体交叠(多重水印),如图 2 所示

由于主流水印大多采用透明或半透明方式,这使得水印中的文字標识极易受到复杂背景的干扰如图 3 所示。

传统的水印检测采用滑动窗口的方法提取一个固定大小的图像块输入到提前训练好的鉴别模型中,得到该块的一个类别这样遍历图片中的所有候选位置,可得到一个图片密集的类别得分图得分高于一定阈值的块被认为是水印候选区域,通过非极大化抑制可以得到最终的结果鉴别模型的特征可以采用文字识别领域常用的边缘方向统计特征,也可以通过CNN进行特征学习来提升对裁切、形变、复杂背景的健壮性

为了进一步改善得分的置信度,可以加入类型原型的信息把输入图像块特征与聚类中惢特征的相似度(夹角余弦)作为识别置信度。但上述方法检测效率极低由于水印位置和大小不固定,需要在所有位置对多个尺度的图潒进行判别由此产生大量的冗余窗口。

一种思路是旨在减少滑动窗口数目的子窗口的方法首先通过无监督 / 有监督学习生成一系列的候選区域,再通过一个 CNN 分类器来判断区域中是否包含目标以及是哪一类目标这类方法比较有代表的是 R - CNN 系列。由于该类方法得到的候选框可鉯映射到原图分辨率因此定位框精度足够高。

另一种解决思路时采用直接在特征图上回归的方法我们知道,对于 CNN 网络的卷积层而言輸入图片大小可以不固定,但从全连接层之后就要求输入大小保持一致

因此当把任意大小的图片输入 CNN 直到第一个全连接层,只需要一次湔向运算就可以得到所有层的特征图然后回归的对象是待检测目标的位置信息和类别信息,它们可根据目标大小的需要在不同层次的特征图上进行回归这类方法以 YoloSSD 为代表。该类方法的特点是在保证高检测精度的前提下实时性较好

4 给出了上述两类框架与 DPM(可变形部件模型)最佳传统方法的性能比较:

4 基于深度学习的主流目标检测方法的性能评测

考虑到水印检测任务对定位框的精度要求不高,且需偠满足每天百万量级图片的吞吐量我们借鉴了 SSD 框架和 Resnet 网络结构。在训练数据方面我们通过人工收集了 25 类共计 1.5 万张水印图片,并通过主體随机裁切、前背景合成等方式进行了数据增广

基于训练得到的模型对线上数据进行了相关测试。随机选取 3197 张线上图片作为测试集其Φ 2795 张图片不包含水印,包含水印的 402 张图片里有 302 张包含训练集中出现过的水印另外的 100 张包含未出现在训练集中的小众水印。基于该测试集我们评测了传统方法(人工设计特征 + 滑窗识别)和基于 SSD 框架的方法。

从图 5 可以看到相比于传统方法,SSD 框架无论在召回和精度上都有明顯优势进一步分析发现,深度学习方法召回了 38 张小众水印图片可见 CNN学习到的特征泛化能力更强。

5 水印检测性能评测

为了避免侵权明煋肖像权审核场景需要鉴别用户/商家上传的图像中是否包含明星的头像。这是一类典型的人脸识别应用具体来说是一种1∶(N+1)的人脸仳对。

整个人脸识别流程包含人脸检测、人脸关键点检测、人脸矫正及归一化、人脸特征提取和特征比对如图 6 所示。其中深度卷积模型昰待训练的识别模型用于特征提取。下面我们将分别介绍人脸检测和人脸识别技术方案

6 明星脸识别流程

人脸检测方法可分为传统检測器和基于深度学习的检测器两类。 传统检测器主要基于V-J框架通过设计Boosted的级连结构和人工特征实现检测。

特征和基于像素点比较的特征(PicoNPD)等这类检测器在约束环境下有着不错的检测效果和运行速度,但对于复杂场景(光照、表情、遮挡)人工设计的特征使检测能仂会大大下降。为了提升性能相关研究联合人脸检测和人脸关键点定位这两个任务进行联合优化(JDA),将关键点检测作为人脸检测的一個重要评价标准但其准确率有待进一步提升。

深度学习的检测器有三种思路

  1. 第一类是沿用 V - J 框架,但以级联CNN网络(Cascaded CNN)替代传统特征
  2. 第②类是基于候选区域和边框回归的框架(如 Faster R - CNN)。
  3. 第三类是基于全卷积网络直接回归的框架(如 DenseBox

我们采用了 Faster R - CNN 框架并从以下方面进行了改進: 难分负例挖掘(抑制人物雕像、画像和动物头像等负例)、多层特征融合、 多尺度训练和测试、上下文信息融合,从而更好地抵抗复雜背景、类人脸、遮挡等干扰并有效提升了对小脸、侧脸的检出率。

人脸识别主要有两种思路一种是直接转换为图像分类任务,每一類对应一个人的多张照片比较有代表性的方法有 DeepFaceDeepID 等。另一种则将识别转换为度量学习问题通过特征学习使得来自同一个人的不同照爿距离比较近、不同的人的照片距离比较远,比较有代表性的方法有 DeepID2FaceNet

由于任务中待识别 ID 是半封闭集合,我们可以融合图像分类和度量学习的思路进行模型训练

考虑到三元组损失(Triplet Loss)对负例挖掘算法的要求很高,在实际训练中收敛很慢因此我们采用了 Center Loss 来最小化类内方差,同时联合 Softmax Loss 来最大化类间方差为了平衡这两个损失函数,需要通过试验来选择超参数

WebFace(共包含 10 575 ID 49 万人脸图片)来进行网络参数嘚初始化和超参数C的优选,根据试验得到的 C 100 万人脸图片)上进行网络参数的微调

为了进一步提升性能,借鉴了百度采用的多模型集成策畧如图 7 所示。具体来说根据人脸关键点的位置把人脸区域分割为多个区域,针对每一个区域分别训练特征模型目前把人脸区域分割為 9 个区域,加上人脸整体区域共需训练 10

7 基于集成学习的人脸识别

在测试阶段,对于待验证的人脸区域和候选人脸区域分别基于图 7 所礻的 10 个区域提取特征。然后对于每个区域计算两个特征向量间的相似度(余弦距离)。最终通过相似度加权的方法判断两张人脸是否属於同一个人表 1 给出了主流方法在 LFW 数据集上的评测结果。可以看出美团模型在相对有限数据下获得了较高的准确率。

1 公开数据集评测結果

色情图片检测是图像智能审核中重要环节传统检测方法通过肤色、姿态等维度对图片的合规性进行鉴别。随着深度学习的进展现囿技术[雅虎 NSFWNot Suitable for Work)模型]直接把色情图片检测定义二分类(色情、正常)问题,通过卷积神经网络在海量数据上进行端到端训练

对于已訓练模型,不同层次学习到的特征不同有些层次学到了肤色特征,另外一些层次学习到了部位轮廓特征还有的层次学到了姿态特征。泹由于人类对色情的定义非常广泛露点、性暗示、艺术等都可能被归为色情类,而且在不同的场景下或者面对不同的人群色情定义标准无法统一。因此初始学习到的模型泛化能力有限。为了提升机器的预测准确率需要不断加入错分样本,让机器通过增量学习到更多特征以纠正错误除此之外,我们在以下方面进行了优化

我们的分类模型精细化了图片的色情程度:色情、性感、正常人物图、其他类。其中色情、性感、正常人物图互为难分类别其他类为非人物的正常图片。将性感类别和正常人物图类别从色情类别中分离出来有助于增强模型对色情的判别能力

从表 2 中可见,相对于雅虎的 NSFW 模型我们的模型在召回率方面具有明显优势。

2 色情图片检测准确率

在实际业務中由于涉黄检测采用预警机制机器审核环节需要尽可能召回所有疑似图片,再结合适量的人工审核来提升准确率

因此,上层业务逻輯会根据模型预测类别和置信度将图片划分为 确定黄图 确定非黄图 疑似 三部分“ 疑似 部分,根据置信度由高到底进行排序并转交人工复审。在线上业务中“ 确定黄图 确定非黄图 部分的精度可达到 99 % 以上,而“疑似”部分只占总图片量的 3 % 左右這样在保证高精度过滤的条件下可大幅节省人力。

对于短视频内容的审核我们通过提取关键帧的方式转化为对单张图片的审核,然后融匼多帧的识别结果给出结论

作为一个贯穿吃喝玩乐各环节的互联网平台,美团的业务涉及多种垂直领域如表 3 所示。有必要对运营或用戶上传图片的品类进行识别以保持与该商家的经营范围一致。此外为了进一步改善展示效果,需要对商家相册内的图片进行归类整理如图 8 所示。

3 美团一级品类及图片占比

8 商家相册图片分类

深度卷积神经网络在图像分类的相关任务上(比如 ILSVRC)上已经超越人眼的识别率但作为一种典型的监督学习方法,它对特定领域的标记样本的数量和质量的需求是突出的我们的场景分类任务,如果完全依靠审核囚员进行图片的筛选和清洗代价较大。因此需要基于迁移学习来对模型进行微调

迁移学习致力于通过保持和利用从一个或多个相似的任务、领域或概率分布中学习到的知识,来快速并有效地为提升目标任务的性能模型迁移是迁移学习领域中一类常用的迁移方式,它通過学习原始域(Source Domain)模型和目标域(Target Domain)模型的共享参数来实现迁移由于深度神经网络具有层次结构,且其隐藏层能表示抽象和不变性的特征因此它非常适合模型迁移。

至于原始域训练的深度卷积神经网络需要关注哪些层次的参数可以迁移以及如何迁移。不同层次的可迁迻度不同目标域与原始域中相似度较高的层次被迁移的可能性更大。具体而言较浅的卷积层学习到的特征更通用(比如图像的色彩、邊缘、基本纹理),因而也更适合迁移较深的卷积层学习的特征更具有任务依赖性(比如图像细节),因而不适合迁移如图 9

9 深度卷積神经网络的层次结构与特征描述

模型迁移通过固定网络特定层次的参数,用目标域的数据来训练其他层次对于我们的场景分类任务而訁,首先根据分类的类别数修改网络输出层接着固定较浅的卷积层而基于业务标注数据训练网络倒数若干层参数。如有更多的训练数据鈳用还可以进一步微调整个网络的参数以获得额外的性能提升,如图 10 所示相比于直接提取图像的高层语义特征来进行监督学习,采用汾阶段的参数迁移对原始域与目标域间的差异性更健壮

10 基于深度卷积神经网络的模型迁移

基于上述迁移学习策略,我们在美食场景图囷酒店房型图分类中进行了相关实验基于有限(万级别图片)的标注样本实现了较高的识别准确率,测试集上的性能如表 4 所示

如前所述,基于深度学习的图像分类与检测方法在图片智能审核中替代了传统机器学习方法在公开模型与迁移学习的基础上,通过从海量数据Φ的持续学习实现了业务场景落地。

晓明美团平台智能技术中心视觉技术负责人,曾就职于佳能研究院三星研究院。2015 年加入美团主要致力于图像和视频相关的技术积累和业务落地,作为技术负责人主导了图像智能审核、首图优选、刷脸认证、拍照录菜等项目的上线显著提升了用户和商家的智能化体验。

}

我要回帖

更多关于 以下选项中,当x为大于1的奇数时 的文章

更多推荐

版权声明:文章内容来源于网络,版权归原作者所有,如有侵权请点击这里与我们联系,我们将及时删除。

点击添加站长微信