锘??xml version="1.0" encoding="utf-8" standalone="yes"?> Ordering鏄疓uava綾誨簱鎻愪緵鐨勪竴涓妧鍒╁己澶х殑姣旇緝鍣ㄥ伐鍏鳳紝Guava鐨凮rdering鍜孞DK Comparator鐩告瘮鍔熻兘鏇村己銆傚畠闈炲父瀹規槗鎵╁睍錛屽彲浠ヨ交鏉炬瀯閫犲鏉傜殑comparator錛岀劧鍚庣敤鍦ㄥ鍣ㄧ殑姣旇緝銆佹帓搴忕瓑鎿嶄綔涓?/p> 銆銆鏈川涓婃潵璇達紝Ordering 瀹炰緥鏃犻潪灝辨槸涓涓壒孌婄殑Comparator 瀹炰緥銆侽rdering鍙槸闇瑕佷緷璧栦簬涓涓瘮杈冨櫒錛堜緥濡傦紝Collections.max錛夌殑鏂規硶錛屽茍浣垮叾鍙綔涓哄疄渚嬫柟娉曘傚彟澶栵紝Ordering鎻愪緵浜嗛摼寮忔柟娉曡皟鐢ㄥ拰鍔犲己鐜版湁鐨勬瘮杈冨櫒銆?/p> 銆銆涓嬮潰鎴戜滑鐪嬬湅Ordering涓殑涓浜涘叿浣撴柟娉曞拰綆鍗曠殑浣跨敤瀹炰緥銆?/p> 銆銆甯歌鐨勯潤鎬佹柟娉曪細 銆銆natural()錛?/strong>浣跨敤Comparable綾誨瀷鐨勮嚜鐒墮『搴忥紝 渚嬪錛氭暣鏁頒粠灝忓埌澶э紝瀛楃涓叉槸鎸夊瓧鍏擱『搴? 銆銆綆鍗曞疄渚嬶細 銆銆杈撳嚭錛?/p> 銆銆鎿嶄綔鏂規硶錛?/p> 銆銆reverse(): 榪斿洖涓庡綋鍓峅rdering鐩稿弽鐨勬帓搴?
]]>
2 <bean name="pathExtensionContentNegotiationStrategy"
3 class="org.springframework.web.accept.PathExtensionContentNegotiationStrategy">
4 <constructor-arg>
5 <props>
6 <!-- if romePresent -->
7 <prop key="atom">application/atom+xml</prop>
8 <prop key="rss">application/rss+xml</prop>
9 <!-- endif -->
10 <!-- if jackson2Present || jacksonPresent -->
11 <prop key="json">application/json</prop>
12 <!-- endif -->
13 <!-- if jaxb2Present -->
14 <prop key="xml">application/xml</prop>
15 <!-- endif -->
16 </props>
17 </constructor-arg>
18 </bean>
19
20 <!-- 閰嶇疆鏄犲皠濯掍綋綾誨瀷鐨勭瓥鐣?nbsp;-->
21 <bean name="mvcContentNegotiationManager"
22 class="org.springframework.web.accept.ContentNegotiationManager">
23 <constructor-arg>
24 <list>
25 <ref bean="pathExtensionContentNegotiationStrategy" />
26 </list>
27 </constructor-arg>
28 </bean>
29
30 <bean class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerMapping">
31 <property name="order" value="0"/>
32 <property name="removeSemicolonContent" value="false"/>
33 <property name="contentNegotiationManager" ref="mvcContentNegotiationManager"/>
34 </bean>
35
36 <!-- 閰嶇疆鏁版嵁杞崲鏈嶅姟錛岄粯璁や嬌鐢ㄦ牸寮忓寲鏁版嵁杞崲鏈嶅姟錛屽彲浠ュ鏃ユ湡鍜屾暟瀛楄繘琛屾牸寮忓寲 -->
37 <bean name="conversionService"
38 class="org.springframework.format.support.DefaultFormattingConversionService">
39 <constructor-arg index="0">
40 <null/>
41 </constructor-arg>
42 <constructor-arg index="1" value="true"/>
43 </bean>
44
45 <bean name="validator"
46 class="org.springframework.validation.beanvalidation.LocalValidatorFactoryBean"/>
47
48 <!-- 閰嶇疆鏁版嵁緇戝畾錛岄氳繃杞崲鏈嶅姟瀹炵幇緇戝畾錛屽鏋滃寘鍚玧sr303瀹炵幇榪樺皢榪涜鏍¢獙 -->
49 <bean name="webBindingInitializer"
50 class="org.springframework.web.bind.support.ConfigurableWebBindingInitializer">
51 <property name="conversionService" ref="conversionService" />
52 <!-- if jsr303Present -->
53 <property name="validator" ref="validator" />
54 <!-- endif -->
55 </bean>
56
57 <bean name="byteArrayHttpMessageConverter"
58 class="org.springframework.http.converter.ByteArrayHttpMessageConverter"/>
59
60 <bean name="stringHttpMessageConverter"
61 class="org.springframework.http.converter.StringHttpMessageConverter">
62 <property name="writeAcceptCharset" value="false" />
63 </bean>
64
65 <bean name="resourceHttpMessageConverter"
66 class="org.springframework.http.converter.ResourceHttpMessageConverter"/>
67 <bean name="sourceHttpMessageConverter"
68 class="org.springframework.http.converter.xml.SourceHttpMessageConverter"/>
69 <bean name="allEncompassingFormHttpMessageConverter"
70 class="org.springframework.http.converter.support.AllEncompassingFormHttpMessageConverter"/>
71 <bean name="atomFeedHttpMessageConverter"
72 class="org.springframework.http.converter.feed.AtomFeedHttpMessageConverter"/>
73 <bean name="rssChannelHttpMessageConverter"
74 class="org.springframework.http.converter.feed.RssChannelHttpMessageConverter"/>
75 <bean name="jaxb2RootElementHttpMessageConverter"
76 class="org.springframework.http.converter.xml.Jaxb2RootElementHttpMessageConverter"/>
77 <bean name="mappingJacksonHttpMessageConverter"
78 class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"/>
79
80 <!-- 閰嶇疆@RequestBody錛孈ResponseBody娉ㄨВ鍙敤鐨勮漿鎹㈠櫒 -->
81 <util:list id="messageConverters"
82 list-class="org.springframework.beans.factory.support.ManagedList">
83 <ref bean="byteArrayHttpMessageConverter" />
84 <ref bean="stringHttpMessageConverter" />
85 <ref bean="resourceHttpMessageConverter" />
86 <ref bean="sourceHttpMessageConverter" />
87 <ref bean="allEncompassingFormHttpMessageConverter" />
88 <!-- if romePresent -->
89 <ref bean="atomFeedHttpMessageConverter" />
90 <ref bean="rssChannelHttpMessageConverter" />
91 <!-- endif -->
92 <!-- if jaxb2Present -->
93 <ref bean="jaxb2RootElementHttpMessageConverter" />
94 <!-- endif -->
95 <!-- if jacksonPresent -->
96 <ref bean="mappingJacksonHttpMessageConverter" />
97 <!-- endif -->
98 </util:list>
99
100 <!-- 灝嗕換鎰忕被鍨嬬殑Controller閫傞厤涓篐andler -->
101 <bean name="requestMappingHandlerAdapter"
102 class="org.springframework.web.servlet.mvc.method.annotation.RequestMappingHandlerAdapter">
103 <property name="contentNegotiationManager" ref="mvcContentNegotiationManager" />
104 <property name="webBindingInitializer" ref="webBindingInitializer" />
105 <property name="messageConverters" ref="messageConverters" />
106 </bean>
107
108 <!-- 榪欎釜鎷︽埅鍣ㄦ毚闇茶漿鎹㈠櫒鏈嶅姟璁﹕pring:bind鍜宻pring:eval鏍囩鍙敤 -->
109 <bean name="csInterceptor"
110 class="org.springframework.web.servlet.handler.ConversionServiceExposingInterceptor">
111 <constructor-arg index="0" ref="conversionService"/>
112 </bean>
113
114 <!-- 鐜板湪鎵鏈夋嫤鎴櫒閮藉繀欏昏瀹氬搷搴旂殑璺緞鏄犲皠 -->
115 <bean name="mappedCsInterceptor"
116 class="org.springframework.web.servlet.handler.MappedInterceptor">
117 <constructor-arg index="0">
118 <null/>
119 </constructor-arg>
120 <constructor-arg index="1" ref="csInterceptor"/>
121 </bean>
122
123 <!-- 浣跨敤@ExceptionHandler娉ㄨВ鐨勬柟娉曟潵澶勭悊Exception錛屼紭鍏堢駭涓?錛堟渶楂橈級 -->
124 <bean name="exceptionHandlerExceptionResolver"
125 class="org.springframework.web.servlet.mvc.method.annotation.ExceptionHandlerExceptionResolver">
126 <property name="contentNegotiationManager" ref="mvcContentNegotiationManager" />
127 <property name="messageConverters" ref="messageConverters" />
128 <property name="order" value="0" />
129 </bean>
130
131 <!-- 濡傛灉鎶涘嚭鐨凟xception綾誨甫鏈堾ResponseStatus娉ㄨВ錛屽搷搴旇繑鍥炶娉ㄨВ鐨凥ttp鐘舵佺爜錛屼紭鍏堢駭涓? -->
132 <bean name="responseStatusExceptionResolver"
133 class="org.springframework.web.servlet.mvc.annotation.ResponseStatusExceptionResolver">
134 <property name="order" value="1" />
135 </bean>
136
137 <!-- SpringMvc鍐呴儴寮傚父澶勭悊 -->
138 <bean name="defaultExceptionResolver"
139 class="org.springframework.web.servlet.mvc.support.DefaultHandlerExceptionResolver">
140 <property name="order" value="2" />
141 </bean>
142
]]>
6.瀵箂ervlet鐨勬瘡涓姹傞兘鍦ㄤ竴涓崟鐙殑綰跨▼涓繍琛岋紝浠諱綍鐗瑰畾servlet綾婚兘鍙湁涓涓疄渚嬨?br />
]]>
銆銆usingToString() 錛?/strong>浣跨敤toString()榪斿洖鐨勫瓧絎︿覆鎸夊瓧鍏擱『搴忚繘琛屾帓搴忥紱
銆銆arbitrary() 錛?/strong>榪斿洖涓涓墍鏈夊璞$殑浠繪剰欏哄簭錛?鍗砪ompare(a, b) == 0 灝辨槸 a == b (identity equality)銆?鏈韓鐨勬帓搴忔槸娌℃湁浠諱綍鍚箟錛?浣嗘槸鍦╒M鐨勭敓鍛藉懆鏈熸槸涓涓父閲忋?/p>import java.util.List;
import org.junit.Test;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
public class OrderingTest {
@Test
public void testStaticOrdering(){
List<String> list = Lists.newArrayList();
list.add("peida");
list.add("jerry");
list.add("harry");
list.add("eva");
list.add("jhon");
list.add("neron");
System.out.println("list:"+ list);
Ordering<String> naturalOrdering = Ordering.natural();
Ordering<Object> usingToStringOrdering = Ordering.usingToString();
Ordering<Object> arbitraryOrdering = Ordering.arbitrary();
System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
System.out.println("usingToStringOrdering:"+ usingToStringOrdering.sortedCopy(list));
System.out.println("arbitraryOrdering:"+ arbitraryOrdering.sortedCopy(list));
}
}list:[peida, jerry, harry, eva, jhon, neron]
naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
usingToStringOrdering:[eva, harry, jerry, jhon, neron, peida]
arbitraryOrdering:[neron, harry, eva, jerry, peida, jhon]
銆銆nullsFirst(): 榪斿洖涓涓皢null鏀懼湪non-null鍏冪礌涔嬪墠鐨凮rdering錛屽叾浠栫殑鍜屽師濮嬬殑Ordering涓鏍鳳紱
銆銆nullsLast()錛氳繑鍥炰竴涓皢null鏀懼湪non-null鍏冪礌涔嬪悗鐨凮rdering錛屽叾浠栫殑鍜屽師濮嬬殑Ordering涓鏍鳳紱
銆銆compound(Comparator)錛氳繑鍥炰竴涓嬌鐢–omparator鐨凮rdering錛孋omparator浣滀負絎簩鎺掑簭鍏冪礌錛屼緥濡傚bug鍒楄〃榪涜鎺掑簭錛屽厛鏍規嵁bug鐨勭駭鍒紝鍐嶆牴鎹紭鍏堢駭榪涜鎺掑簭錛?br style="margin: 0px; padding: 0px;" />銆銆lexicographical()錛氳繑鍥炰竴涓寜鐓у瓧鍏稿厓绱犺凱浠g殑Ordering錛?br style="margin: 0px; padding: 0px;" />銆銆onResultOf(Function)錛氬皢function搴旂敤鍦ㄥ悇涓厓绱犱笂涔嬪悗, 鍦ㄤ嬌鐢ㄥ師濮媜rdering榪涜鎺掑簭錛?br style="margin: 0px; padding: 0px;" />銆銆greatestOf(Iterable iterable, int k)錛氳繑鍥炴寚瀹氱殑絎琸涓彲榪唬鐨勬渶澶х殑鍏冪礌錛屾寜鐓ц繖涓粠鏈澶у埌鏈灝忕殑欏哄簭銆傛槸涓嶇ǔ瀹氱殑銆?br style="margin: 0px; padding: 0px;" />銆銆leastOf(Iterable<E> iterable,int k)錛氳繑鍥炴寚瀹氱殑絎琸涓彲榪唬鐨勬渶灝忕殑鍏冪礌錛屾寜鐓ц繖涓粠鏈灝忓埌鏈澶х殑欏哄簭銆傛槸涓嶇ǔ瀹氱殑銆?br style="margin: 0px; padding: 0px;" />銆銆isOrdered(Iterable)錛氭槸鍚︽湁搴忥紝Iterable涓嶈兘灝戜簬2涓厓绱犮?br style="margin: 0px; padding: 0px;" />銆銆isStrictlyOrdered(Iterable)錛氭槸鍚︿弗鏍兼湁搴忋傝娉ㄦ剰錛孖terable涓嶈兘灝戜簬涓や釜鍏冪礌銆?br style="margin: 0px; padding: 0px;" />銆銆sortedCopy(Iterable)錛氳繑鍥炴寚瀹氱殑鍏冪礌浣滀負涓涓垪琛ㄧ殑鎺掑簭鍓湰銆?/p>package com.peidasoft.guava.base;
import java.util.List;
import org.junit.Test;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Lists;
import com.google.common.collect.Ordering;
public class OrderingTest {
@Test
public void testOrdering(){
List<String> list = Lists.newArrayList();
list.add("peida");
list.add("jerry");
list.add("harry");
list.add("eva");
list.add("jhon");
list.add("neron");
System.out.println("list:"+ list);
Ordering<String> naturalOrdering = Ordering.natural();
System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
List<Integer> listReduce= Lists.newArrayList();
for(int i=9;i>0;i--){
listReduce.add(i);
}
List<Integer> listtest= Lists.newArrayList();
listtest.add(1);
listtest.add(1);
listtest.add(1);
listtest.add(2);
Ordering<Integer> naturalIntReduceOrdering = Ordering.natural();
System.out.println("listtest:"+ listtest);
System.out.println(naturalIntReduceOrdering.isOrdered(listtest));
System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(listtest));
System.out.println("naturalIntReduceOrdering:"+ naturalIntReduceOrdering.sortedCopy(listReduce));
System.out.println("listReduce:"+ listReduce);
System.out.println(naturalIntReduceOrdering.isOrdered(naturalIntReduceOrdering.sortedCopy(listReduce)));
System.out.println(naturalIntReduceOrdering.isStrictlyOrdered(naturalIntReduceOrdering.sortedCopy(listReduce)));
Ordering<String> natural = Ordering.natural();
List<String> abc = ImmutableList.of("a", "b", "c");
System.out.println(natural.isOrdered(abc));
System.out.println(natural.isStrictlyOrdered(abc));
System.out.println("isOrdered reverse :"+ natural.reverse().isOrdered(abc));
List<String> cba = ImmutableList.of("c", "b", "a");
System.out.println(natural.isOrdered(cba));
System.out.println(natural.isStrictlyOrdered(cba));
System.out.println(cba = natural.sortedCopy(cba));
System.out.println("max:"+natural.max(cba));
System.out.println("min:"+natural.min(cba));
System.out.println("leastOf:"+natural.leastOf(cba, 2));
System.out.println("naturalOrdering:"+ naturalOrdering.sortedCopy(list));
System.out.println("leastOf list:"+naturalOrdering.leastOf(list, 3));
System.out.println("greatestOf:"+naturalOrdering.greatestOf(list, 3));
System.out.println("reverse list :"+ naturalOrdering.reverse().sortedCopy(list));
System.out.println("isOrdered list :"+ naturalOrdering.isOrdered(list));
System.out.println("isOrdered list :"+ naturalOrdering.reverse().isOrdered(list));
list.add(null);
System.out.println(" add null list:"+list);
System.out.println("nullsFirst list :"+ naturalOrdering.nullsFirst().sortedCopy(list));
System.out.println("nullsLast list :"+ naturalOrdering.nullsLast().sortedCopy(list));
}
}
//============杈撳嚭==============
list:[peida, jerry, harry, eva, jhon, neron]
naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
listtest:[1, 1, 1, 2]
true
false
naturalIntReduceOrdering:[1, 2, 3, 4, 5, 6, 7, 8, 9]
listReduce:[9, 8, 7, 6, 5, 4, 3, 2, 1]
true
true
true
true
isOrdered reverse :false
false
false
[a, b, c]
max:c
min:a
leastOf:[a, b]
naturalOrdering:[eva, harry, jerry, jhon, neron, peida]
leastOf list:[eva, harry, jerry]
greatestOf:[peida, neron, jhon]
reverse list :[peida, neron, jhon, jerry, harry, eva]
isOrdered list :false
isOrdered list :false
add null list:[peida, jerry, harry, eva, jhon, neron, null]
nullsFirst list :[null, eva, harry, jerry, jhon, neron, peida]
nullsLast list :[eva, harry, jerry, jhon, neron, peida, null]
]]>
]]>
鏁版嵁搴撲簨鍔$殑闅旂綰у埆鏈?涓紝鐢變綆鍒伴珮渚濇涓篟ead uncommitted 銆丷ead committed 銆丷epeatable read 銆丼erializable 錛岃繖鍥涗釜綰у埆鍙互閫愪釜瑙e喅鑴忚 銆佷笉鍙噸澶嶈 銆佸夠璇?nbsp;榪欏嚑綾婚棶棰樸?/span>
√: 鍙兘鍑虹幇 ×: 涓嶄細鍑虹幇
鑴忚 | 涓嶅彲閲嶅璇?/span> | 騫昏 | |
Read uncommitted | √ | √ | √ |
Read committed | × | √ | √ |
Repeatable read | × | × | √ |
Serializable | × | × | × |
娉ㄦ剰錛氭垜浠璁洪殧紱葷駭鍒殑鍦烘櫙錛屼富瑕佹槸鍦ㄥ涓簨鍔″茍鍙?nbsp;鐨勬儏鍐典笅錛屽洜姝わ紝鎺ヤ笅鏉ョ殑璁茶В閮藉洿緇曚簨鍔″茍鍙戙?/span>
鍏徃鍙戝伐璧勪簡錛岄瀵兼妸5000鍏冩墦鍒皊ingo鐨勮處鍙蜂笂錛屼絾鏄浜嬪姟騫舵湭鎻愪氦錛岃宻ingo姝eソ鍘繪煡鐪嬭處鎴鳳紝鍙戠幇宸ヨ祫宸茬粡鍒拌處錛屾槸5000鍏冩暣錛岄潪甯擱珮 鍏淬傚彲鏄笉騫哥殑鏄紝棰嗗鍙戠幇鍙戠粰singo鐨勫伐璧勯噾棰濅笉瀵癸紝鏄?000鍏冿紝浜庢槸榪呴熷洖婊氫簡浜嬪姟錛屼慨鏀歸噾棰濆悗錛屽皢浜嬪姟鎻愪氦錛屾渶鍚巗ingo瀹為檯鐨勫伐璧勫彧鏈?2000鍏冿紝singo絀烘鍠滀竴鍦恒?/span>
鍑虹幇涓婅堪鎯呭喌錛屽嵆鎴戜滑鎵璇寸殑鑴忚 錛屼袱涓茍鍙戠殑浜嬪姟錛?#8220;浜嬪姟A錛氶瀵肩粰singo鍙戝伐璧?#8221;銆?#8220;浜嬪姟B錛歴ingo鏌ヨ宸ヨ祫璐︽埛”錛屼簨鍔璇誨彇浜嗕簨鍔灝氭湭鎻愪氦鐨勬暟鎹?/span>
褰撻殧紱葷駭鍒緗負Read uncommitted 鏃訛紝灝卞彲鑳藉嚭鐜拌剰璇伙紝濡備綍閬垮厤鑴忚錛岃鐪嬩笅涓涓殧紱葷駭鍒?/span>
singo鎷跨潃宸ヨ祫鍗″幓娑堣垂錛岀郴緇熻鍙栧埌鍗¢噷紜疄鏈?000鍏冿紝鑰屾鏃跺ス鐨勮佸﹩涔熸濂藉湪緗戜笂杞處錛屾妸singo宸ヨ祫鍗$殑2000鍏冭漿鍒板彟涓璐︽埛錛屽茍鍦?singo涔嬪墠鎻愪氦浜嗕簨鍔★紝褰搒ingo鎵f鏃訛紝緋葷粺媯鏌ュ埌singo鐨勫伐璧勫崱宸茬粡娌℃湁閽憋紝鎵f澶辮觸錛宻ingo鍗佸垎綰抽椃錛屾槑鏄庡崱閲屾湁閽憋紝涓?浣?.....
鍑虹幇涓婅堪鎯呭喌錛屽嵆鎴戜滑鎵璇寸殑涓嶅彲閲嶅璇?nbsp;錛屼袱涓茍鍙戠殑浜嬪姟錛?#8220;浜嬪姟A錛歴ingo娑堣垂”銆?#8220;浜嬪姟B錛歴ingo鐨勮佸﹩緗戜笂杞處”錛屼簨鍔浜嬪厛璇誨彇浜嗘暟鎹紝浜嬪姟B绱ф帴浜嗘洿鏂頒簡鏁版嵁錛屽茍鎻愪氦浜嗕簨鍔★紝鑰屼簨鍔鍐嶆璇誨彇璇ユ暟鎹椂錛屾暟鎹凡緇忓彂鐢熶簡鏀瑰彉銆?/span>
褰撻殧紱葷駭鍒緗負Read committed 鏃訛紝閬垮厤浜嗚剰璇伙紝浣嗘槸鍙兘浼氶犳垚涓嶅彲閲嶅璇匯?/span>
澶у鏁版暟鎹簱鐨勯粯璁ょ駭鍒氨鏄疪ead committed錛屾瘮濡係ql Server , Oracle銆傚浣曡В鍐充笉鍙噸澶嶈榪欎竴闂錛岃鐪嬩笅涓涓殧紱葷駭鍒?/span>
褰撻殧紱葷駭鍒緗負Repeatable read 鏃訛紝鍙互閬垮厤涓嶅彲閲嶅璇匯傚綋singo鎷跨潃宸ヨ祫鍗″幓娑堣垂鏃訛紝涓鏃︾郴緇熷紑濮嬭鍙栧伐璧勫崱淇℃伅錛堝嵆浜嬪姟寮濮嬶級錛宻ingo鐨勮佸﹩灝變笉鍙兘瀵硅璁板綍榪涜淇敼錛屼篃灝辨槸singo鐨勮佸﹩涓嶈兘鍦ㄦ鏃惰漿璐︺?/span>
铏界劧Repeatable read閬垮厤浜嗕笉鍙噸澶嶈錛屼絾榪樻湁鍙兘鍑虹幇騫昏 銆?/span>
singo鐨勮佸﹩宸ヤ綔鍦ㄩ摱琛岄儴闂紝濂規椂甯擱氳繃閾惰鍐呴儴緋葷粺鏌ョ湅singo鐨勪俊鐢ㄥ崱娑堣垂璁板綍銆傛湁涓澶╋紝濂規鍦ㄦ煡璇㈠埌singo褰撴湀淇$敤鍗$殑鎬繪秷璐歸噾棰?錛坰elect sum(amount) from transaction where month = 鏈湀錛変負80鍏冿紝鑰宻ingo姝ゆ椂姝eソ鍦ㄥ闈㈣儭鍚冩搗濉炲悗鍦ㄦ敹閾跺彴涔板崟錛屾秷璐?000鍏冿紝鍗蟲柊澧炰簡涓鏉?000鍏冪殑娑堣垂璁板綍錛坕nsert transaction ... 錛夛紝騫舵彁浜や簡浜嬪姟錛岄殢鍚巗ingo鐨勮佸﹩灝唖ingo褰撴湀淇$敤鍗℃秷璐圭殑鏄庣粏鎵撳嵃鍒癆4綰鎬笂錛屽嵈鍙戠幇娑堣垂鎬婚涓?080鍏冿紝singo鐨勮佸﹩寰堣寮傦紝浠ヤ負鍑?鐜頒簡騫昏錛屽夠璇誨氨榪欐牱浜х敓浜嗐?/span>
娉細Mysql鐨勯粯璁ら殧紱葷駭鍒氨鏄疪epeatable read銆?/span>
Serializable 鏄渶楂樼殑浜嬪姟闅旂綰у埆錛屽悓鏃朵唬浠蜂篃鑺辮垂鏈楂橈紝鎬ц兘寰堜綆錛屼竴鑸緢灝戜嬌鐢紝鍦ㄨ綰у埆涓嬶紝浜嬪姟欏哄簭鎵ц錛屼笉浠呭彲浠ラ伩鍏嶈剰璇匯佷笉鍙噸澶嶈錛岃繕閬垮厤浜嗗夠鍍忚銆?/span>
Google鏄竴涓潪甯鎬紭縐鐨勫叕鍙搞備粬浠仛鍑轟簡寰堝浠や漢縐拌禐鐨勪笢瑗?#8212;鏃㈡槸鍏徃澶栭儴錛屼漢浠彲浠ョ湅鍒扮殑涓滆タ錛屼篃鏄叕鍙稿唴閮ㄣ傛湁涓浜涘湪鍏徃鍐呴儴騫朵笉灞炰簬淇濆瘑鐨勪簨鎯咃紝鍦ㄥ閮ㄥ茍娌℃湁緇欎簣瓚沖騫挎硾鐨勮璁恒傝繖灝辨槸鎴戜粖澶╄璇寸殑銆?/p>
璁〨oogle鐨勭▼搴忓姝や紭縐鐨勪竴涓渶閲嶈鐨勪簨鎯呯湅璧鋒潵鏄潪甯哥殑綆鍗曪細浠g爜瀹℃煡銆傚茍涓嶆槸鍙湁Google鍋氳繖涓簨鎯?#8212;浠g爜瀹℃煡宸茬粡琚箍娉涚殑璁ゅ彲涓轟竴縐嶉潪甯稿ソ鐨勫仛娉曪紝寰堝浜洪兘鍦ㄨ繖鏍峰仛銆備絾鎴戣繕娌℃湁鐪嬪埌絎簩瀹惰繖鏍峰ぇ鐨勫叕鍙歌兘鎶婅繖縐嶄簨鎯呰繍鐢ㄧ殑濡傛鏅亶銆傚湪Google錛?strong style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background: transparent;">娌℃湁紼嬪簭錛屼換浣曚駭鍝併佷換浣曢」鐩殑紼嬪簭浠g爜錛屽彲浠ュ湪娌℃湁緇忚繃鏈夋晥鐨勪唬鐮佸鏌ュ墠鎻愪氦鍒頒唬鐮佸簱閲岀殑銆?/p>
鎵鏈変漢閮借緇忚繃浠g爜瀹℃煡銆傚茍涓斿緢姝h鐨勶細榪欑浜嬫儏搴旇鎴愪負浠諱綍閲嶈鐨勮蔣浠跺紑鍙戝伐浣滀腑涓涓熀鏈埗搴︺傚茍涓嶅崟鎸囦駭鍝佺▼搴?#8212;—鎵鏈変笢瑗褲傚畠涓嶉渶瑕佸緢澶氱殑宸ヤ綔錛屼絾瀹冪殑鏁堟灉鏄法澶х殑銆?/p>
浠庝唬鐮佸鏌ラ噷鑳藉緱鍒頒粈涔堬紵
寰堟樉鐒訛細鍦ㄤ唬鐮佹彁浜ゅ墠錛岀敤絎簩緹ょ溂鐫涙鏌ヤ竴閬嶏紝闃叉bug娣峰叆銆傝繖鏄鍏舵渶甯歌鐨勭悊瑙o紝鏄浠g爜瀹℃煡鐨勫ソ澶勭殑鏈騫挎硾鐨勮璇嗐備絾鏄紝渚濇垜鐨勭粡楠屾潵鐪嬶紝榪欏弽鍊掓槸瀹?strong style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background: transparent;">鏈涓嶉噸瑕?/strong>鐨勪竴鐐廣備漢浠‘瀹炲湪浠g爜瀹℃煡涓壘鍒頒簡bug銆傚彲鏄紝榪欎簺鍦ㄤ唬鐮佸鏌ヤ腑鑳藉彂鐜扮殑緇濆ぇ閮ㄥ垎bug錛屽緢鏄劇劧錛岄兘鏄井涓嶈凍閬撶殑bug錛岀▼搴忕殑浣滆呰姳鍑犲垎閽熺殑鏃墮棿灝辮兘鍙戠幇瀹冧滑銆傜湡姝i渶瑕佽姳鏃墮棿鍘誨彂鐜扮殑bug涓嶆槸鍦ㄤ唬鐮佸鏌ラ噷鑳芥壘鍒扮殑銆?/p>
浠g爜瀹℃煡鐨勬渶澶х殑鍔熺敤鏄函紺句細鎬х殑銆傚鏋滀綘鍦ㄧ紪紼嬶紝鑰屼笖鐭ラ亾灝嗕細鏈夊悓浜嬫鏌ヤ綘鐨勪唬鐮侊紝浣犵紪紼嬫佸害灝卞畬鍏ㄤ笉涓鏍蜂簡銆備綘鍐欏嚭鐨勪唬鐮佸皢鏇村姞鏁存磥錛屾湁鏇村ソ鐨勬敞閲婏紝鏇村ソ鐨勭▼搴忕粨鏋?#8212;—鍥犱負浣?strong style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background: transparent;">鐭ラ亾錛岄偅涓綘寰堝湪鎰忕殑浜哄皢浼氭煡鐪嬩綘鐨勭▼搴忋傛病鏈変唬鐮佸鏌ワ紝浣犵煡閬撲漢浠渶緇堣繕鏄細鐪嬩綘鐨勭▼搴忋備絾榪欑浜嬫儏涓嶆槸绔嬪嵆鍙戠敓鐨勪簨錛屽畠涓嶄細緇欎綘甯︽潵鍚岀瓑鐨勭揣榪劅錛屽畠涓嶄細緇欎綘鐩稿悓鐨勪釜浜鴻瘎鍒ょ殑閭g鎰熷彈銆?/p>
榪樻湁涓涓潪甯擱噸瑕佺殑濂藉銆備唬鐮佸鏌ヨ兘浼犳挱鐭ヨ瘑銆傚湪寰堝鐨勫紑鍙戝洟闃熼噷錛岀粡甯告瘡涓涓漢璐熻矗涓涓牳蹇冩ā鍧楋紝姣忎釜浜洪兘鍙叧娉ㄤ粬鑷繁鐨勯偅涓ā鍧椼傞櫎闈炴槸鍚屼簨鐨勬ā鍧楀獎鍝嶄簡鑷繁鐨勭▼搴忥紝浠栦滑浠庝笉鐩鎬簰浜ゆ祦銆傝繖縐嶆儏鍐電殑鍚庢灉鏄紝姣忎釜妯″潡鍙湁涓涓漢鐔熸倝閲岄潰鐨勪唬鐮併傚鏋滆繖涓漢浼戝亣鎴?#8212;—浣嗘効涓嶆槸——杈炶亴浜嗭紝鍏朵粬浜哄垯鏉熸墜鏃犵瓥銆傞氳繃浠g爜瀹℃煡錛岃嚦灝戜細鏈変袱涓漢鐔熸倝榪欎簺紼嬪簭——浣滆咃紝浠ュ強瀹℃煡鑰呫傚鏌ヨ呭茍涓嶈兘鍍忕▼搴忕殑浣滆呬竴鏍峰紼嬪簭鍗佸垎浜嗚В——浣嗕粬浼氱啛鎮夌▼搴忕殑璁捐鍜屾灦鏋勶紝榪欐槸鏋佸叾閲嶈鐨勩?/p>
褰撶劧錛屾病鏈変粈涔堜簨鎯呰兘綆鍗曠殑鍋氫笅鏉ョ殑銆備緷鎴戠殑緇忛獙錛屽湪浣犺兘姝g‘鐨勮繘琛屼唬鐮佸鏌ュ墠錛屼綘闇瑕佽姳鏃墮棿閿葷偧瀛︿範銆傛垜鍙戠幇浜轟滑鍦ㄤ唬鐮佸鏌ユ椂緇忓父浼氱姱涓浜涢敊璇紝瀵艱嚧涓嶅皯楹葷儲——灝ゅ叾鍦ㄤ竴浜涚己涔忕粡楠岀殑瀹℃煡鑰呬腑緇忓父鐨勫嚭鐜幫紝浠栦滑緇欎簡浜轟滑涓涓緢閬殑浠g爜瀹℃煡鐨勪綋楠岋紝鎴愪負浜嗕漢浠帴鍙椾唬鐮佸鏌ュ埗搴︾殑涓涓殰紕嶃?/p>
鏈閲嶈鐨勪竴涓師鍒欙細浠g爜瀹℃煡鐢ㄦ剰鏄湪浠g爜鎻愪氦鍓嶆壘鍒板叾涓殑闂——浣犺鍙戠幇鏄畠鐨?strong style="border: 0px; margin: 0px; padding: 0px; vertical-align: baseline; background: transparent;">姝g‘銆傚湪浠g爜瀹℃煡涓渶甯哥姱鐨勯敊璇?#8212;—鍑犱箮姣忎釜鏂版墜閮戒細鐘殑閿欒——鏄紝瀹℃煡鑰呮牴鎹嚜宸辯殑緙栫▼涔犳儻鏉ヨ瘎鍒ゅ埆浜虹殑浠g爜銆?/p>
瀵逛簬涓涓棶棰橈紝閫氬父鎴戜滑鑳芥壘鍑哄崄鍑犵鏂規硶鍘昏В鍐熾傚浜庝竴縐嶈В鍐蟲柟妗堬紝鎴戜滑鑳芥湁鐧句竾縐嶇紪鐮佹柟妗堟潵瀹炵幇瀹冦備綔涓轟竴涓鏌ヨ咃紝浣犵殑浠誨姟涓嶆槸鏉ョ‘淇濊瀹℃煡鐨勪唬鐮侀兘閲囩敤鐨勬槸浣犵殑緙栫爜椋庢牸——鍥犱負瀹冧笉鍙兘璺熶綘鍐欑殑涓鏍楓備綔涓轟竴孌典唬鐮佺殑瀹℃煡鑰呯殑浠誨姟鏄‘淇濈敱浣滆呰嚜宸卞啓鍑虹殑浠g爜鏄紜殑銆備竴鏃﹁繖涓師鍒欒鎵撶牬錛屼綘鏈緇堝皢浼氬嶆劅鎶樼(錛屾繁鍙楁尗鎶?#8212;—榪欏彲涓嶆槸鎴戜滑鎯寵鐨勭粨鏋溿?/p>
闂鍦ㄤ簬錛岃繖縐嶉敊璇槸濡傛鐨勬櫘閬嶈屾槗鐘傚鏋滀綘鏄釜紼嬪簭鍛橈紝褰撲綘閬囧埌涓涓棶棰橈紝浣犺兘鎯沖埌涓縐嶈В鍐蟲柟妗?#8212;—浣犲氨鎶婁綘鎯沖埌鐨勬柟妗堜綔涓烘爣鍑嗙瓟妗堛備絾浜嬫儏涓嶆槸榪欐牱鐨?#8212;—浣滀負涓涓ソ鐨勫鏌ヨ咃紝浣犻渶瑕佹槑鐧借繖涓亾鐞嗐?/p>
浠g爜瀹℃煡鐨勭浜屼釜鏄撶姱鐨勬瘺鐥呮槸錛屼漢浠寰楁湁鍘嬪姏錛屾劅瑙夐潪瑕佽鐐逛粈涔堟墠濂姐備綘鐭ラ亾浣滆呯敤浜嗗ぇ閲忕殑鏃墮棿鍜岀簿鍔涙潵瀹炵幇榪欎簺紼嬪簭——涓嶈璇寸偣浠涔堝悧錛?/p>
涓嶏紝浣犱笉闇瑕併?/p>
鍙涓鍙?#8220;鍝囷紝涓嶉敊鍛”錛屼換浣曟椂鍊欓兘涓嶄細涓嶅悎閫傘傚鏋滀綘鎬繪槸鍔涘浘鎵懼嚭涓鐐逛粈涔堜笢瑗挎潵鎵硅瘎錛屼綘榪欐牱鍋氱殑緇撴灉鍙細鎹熷鑷繁鐨勫▉鏈涖傚綋浣犱笉鍘屽叾鐑︾殑鎵懼嚭涓浜涗笢瑗挎潵錛屽彧鏄負浜嗚浜涗粈涔堬紝琚鏌ヤ漢灝變細鐭ラ亾錛屼綘璇磋繖浜涜瘽鍙槸涓轟簡濉ˉ瀵傞潤銆備綘鐨勮瘎璁哄皢涓嶅啀琚漢閲嶈銆?/p>
絎笁鏄熷害銆備綘涓嶈兘鍖嗗寙蹇欏繖鐨勮繘琛屼竴嬈′唬鐮佸鏌?#8212;—浣嗕綘涔熻鑳借繀閫熺殑瀹屾垚銆備綘鐨勫悓浼村湪絳変綘銆傚鏋滀綘鍜屼綘鐨勫悓浜嬪茍涓嶆兂鑺卞お澶氭椂闂磋繘琛屼唬鐮佸鏌ワ紝浣犱滑寰堝揩鐨勫畬鎴愶紝閭h瀹℃煡鑰呬細瑙夊緱寰堟伯涓э紝榪欑浠g爜瀹℃煡甯︽潵鐨勫彧鏈夊け鏈涚殑鎰熻銆傚氨濂借薄鏄墦鎼呬簡澶у錛屼嬌澶у鏀句笅鎵嬪ご鐨勫伐浣滄潵榪涜瀹℃煡銆備簨鎯呬笉璇ユ槸榪欐牱銆備綘騫朵笉闇瑕佹帹鎺夋墜澶翠笂鐨勪換浣曚簨鎯呮潵鍋氫唬鐮佸鏌ャ備絾濡傛灉涓旇借浜嗗嚑涓皬鏃訛紝浣犱腑闂磋繕瑕佷紤鎭竴浼氾紝鍠濇澂鑼訛紝鍐蹭釜婢★紝鎴栬皥浼氬効闂茶瘽銆傚綋浣犲洖鍒板鏌ョ幇鍦猴紝浣犲彲浠ョ戶緇笅鍘伙紝鎶婁簨鎯呭仛瀹屻傚鏋滀綘鐪熸槸榪欐牱錛屾垜鎯蟲病鏈変漢鎰挎剰鍦ㄩ偅騫茬瓑鐫浣犮?/p>