ÒªÏëÁ˽âSpringµÄÊÂÎñ£¬Ê×ÏÈÒªÁ˽âÊý¾Ý¿âÊÂÎñµÄ»ù±¾ÖªÊ¶£¬Êý¾Ý¿â²¢·¢»á²úÉúºÜ¶àÎÊÌ⣬SpringʹÓÃThreadLocal¼¼ÊõÀ´´¦ÀíÕâЩÎÊÌ⣬ÄÇôÎÒÃDZØÐëÁ˽âJavaµÄThreadLocal¼¼Êõ¡£ÏÂÃæÎÒÃÇÖðÒ»Á˽⡣
µÚÒ»»ØºÏ£ºÊý¾Ý¿âÊÂÎñµÄ»ù±¾ÖªÊ¶
ʲôÊÇÊý¾Ý¿âÊÂÎñ£¿
Ò»´ÎÖ´Ðжà¸öSQLÓï¾ä£¬È«²¿Ö´Ðгɹ¦Ôò³É¹¦£¬ÓÐÒ»¸öÖ´ÐÐʧ°ÜÔòÈ«²¿Ê§°Ü¡£¼´¡°Ò»ÈÙ¾ãÈÙ£¬Ò»Ëð¾ãË𡱡£
Êý¾Ý¿âµÄÊÂÎñ±ØÐëͬʱÂú×ãÏÂÁÐËĸöÌõ¼þ£º
Ô×ÓÐÔ£¨Atomic£©£º±ÈÈçÊý¾Ý¿âÒ»´ÎÖ´ÐÐËĸöSQLÓï¾ä£¬ÄÇôÕâËĸöSQL¾ÍÊǺê¹ÛµÄÒ»¸ö²»¿É·Ö¸îµ¥Ôª£¬¡°Ò»ÈÙ¾ãÈÙ£¬Ò»Ëð¾ãË𡱡£È«²¿Ö´Ðгɹ¦Ôò³É¹¦£¬ÓÐÒ»¸öÖ´ÐÐʧ°ÜÔòÈ«²¿Ê§°Ü¡£Èý·Ö¹éÔªÆø¡£
Ò»ÖÂÐÔ£¨Consistency£©£ºÕû¸öÊÂÎñ²»¹Ü³É¹¦ÁË»¹ÊÇʧ°ÜÁË£¬Õû¸öÊý¾Ý¿âµÄ״̬ºÍ¹æÔò²»Äܱ仯¡£¼´£ºAÕË»§×ªÕË100Ôªµ½BÕË»§£¬Õâ¸öÊÂÎñ¹ý³Ì½áÊøºóǰºó£¬Êý¾Ý¿âÖÐ×ܵÄÕË»§½ð¶îÊDz»±äµÄ¡£
¸ôÀëÐÔ£¨Isolation£©£º²»Í¬µÄÊÂÎñ²¢·¢Ö´ÐÐʱ£¬¸÷×ÔÓµÓв»Í¬µÄÊý¾Ý¿Õ¼ä£¬Äã×ßÄãµÄÑô¹ØµÀ£¬ÎÒ×ßÎҵĶÀľÇÅ£¬»¥²»¸ÉÈÅ¡£
µ«²¢·ÇÍêÈ«²»¸ÉÈÅ£¬Êý¾Ý¿â¹æ¶¨ÁËÊÂÎñ¸ôÀë¼¶±ð£¬¸ôÀë¼¶±ðÔ½¸ß£¬Êý¾ÝµÄÒ»ÖÂÐÔÔ½ºÃ£¬²¢·¢ÐÔÔ½Èõ¡£
³Ö¾ÃÐÔ£¨Durability£©£ºÒ»µ©ÊÂÎñÌá½»³É¹¦£¬ÊÂÎñÖеÄËùÓÐÊý¾Ý²Ù×÷¶¼±ØÐë±»³Ö¾Ã»¯µ½Êý¾Ý¿âÖС£
ÕâÑùÒ»À´£¬¼´Ê¹¸ÕÌá½»Í꣬Êý¾Ý¿â¾Í±ÀÀ££¬µ±ÖØÆôÊý¾Ý¿âÖ®ºó£¬Ò²¿ÉÒÔ¸ù¾ÝÒѾ±£´æ£¨³Ö¾Ã»¯£©µÄ²Ù×÷À´»Ö¸´Êý¾Ý¡£
Ò»ÖÂÐÔÊǽá¹û£¬ÆäËûÈý¸öÊÇÊֶΡ£
Êý¾Ý¿â¹ÜÀíÒ»°ã²ÉÓÃÖØÖ´ÐÐÈÕÖ¾±£Ö¤Ô×ÓÐÔ¡¢Ò»ÖÂÐԺͳ־ÃÐÔ¡£
ÖØÖ´ÐÐÈÕÖ¾¼Ç¼ÁËÊý¾Ý¿â±ä»¯µÄÿһ¸ö¶¯×÷¡£ÕâÑù£¬¼´Ê¹Êý¾Ý¿âÊÂÎñÔÚÖ´ÐÐÁËÒ»²¿·Ö²Ù×÷ºó·¢Éú´íÎóÍ˳ö£¬¿ÉÒÔ¸ù¾ÝÖØÖ´ÐÐÈÕÖ¾À´³·ÏúÒѾִÐеIJÙ×÷¡£
¶ÔÓÚÒѾÌá½»µÄÊÂÎñ£¬¼´Ê¹Êý¾Ý¿â±ÀÀ££¬ÔÙÖØÆôÊý¾Ý¿âʱҲÄܹ»¸ù¾ÝÈÕÖ¾¶ÔÉÐδ³Ö¾Ã»¯µÄÊý¾Ý½øÐÐÏàÓ¦µÄÖØÖ´ÐвÙ×÷¡£
Êý¾Ý¿â¹ÜÀíϵͳ²ÉÓÃÊý¾Ý¿âËø»úÖÆÀ´±£Ö¤ÊÂÎñµÄ¸ôÀëÐÔ£¨ÕýÈçJava²ÉÓöÔÏóËø»úÖÆ½øÐÐÏß³Ìͬ²½¡££©
Êý¾Ý²¢·¢µÄÎÊÌâ
¶à¸ö¿Í»§¶Ëͬʱ²Ù×÷Ò»¸öÊý¾Ý¿â£¬¸Ã²¢·¢¹ý³Ì¾Í¿ÉÄÜÒýÆð²¢·¢ÎÊÌ⣺
Ôà¶Á(dirty read)£ºAÊÂÎñ¶ÁÈ¡BÊÂÎñÉÐδÌá½»µÄÊý¾Ý²¢½øÐÐһϵÁвÙ×÷£¬½á¹ûBÊÂÎñÖ´ÐÐÁ˻عö£¬ÄÇôÕâʱ£¬AÊÂÎñ¶Áµ½µÄÊý¾Ý¾ÍÊDz»±»ÈϿɵģ¬ÊÇÔàÊý¾Ý¡£
²»¿ÉÖØ¸´¶Á(unrepeatable read):±ÈÈ磺A¿ªÊ¼Á˲éѯÊÂÎñ£¬B¿ªÊ¼ÁËÌá¿îÊÂÎñ¡£AµÚÒ»´Î²éѯÓà¶îΪ1000Ôª£¬ÕâʱBÌáÈ¡100Ôª£¬AµÚ¶þ´Î²éѯÓà¶îʱ£¬±ä³ÉÁË900Ôª£¬ÓëµÚÒ»´Î²éѯµÄÓà¶î²»Í¬¡£
»ÃÏó¶Á£¨phantom read£©£ºÒ»°ã·¢ÉúÔÚ¼ÆËãͳ¼ÆÊý¾ÝµÄÊÂÎñÖС£±ÈÈç£»ÒøÐÐÕýÔÚͳ¼ÆËùÓÐÕË»§µÄ´æ¿î×ܶͳ¼Æ³öÀ´Îª10000Ôª¡£ÕâʱÕýºÃÐÂÔöÁËÒ»¸öÕË»§£¬´æ¿î1000Ôª¡£ÔÙ´Îͳ¼Æ·¢ÏÖ×ܶîΪ11000Ôª£¬Óëǰһ´Îͳ¼Æ²»Í¬¡£
²»¿ÉÖØ¸´¶ÁÊÇÖ¸¶Áµ½Á˸ü¸ÄµÄÊý¾Ý£¨Ò»°ãÇé¿öÏÂÐèÒªÌí¼ÓÐм¶Ëø£¬×èÖ¹²Ù×÷ÖеÄÊý¾Ý±ä»¯£©£¬¶ø»ÃÏó¶ÁÊÇÖ¸¶Áµ½ÁËÐÂÔöµÄÊý¾Ý£¨ÍùÍùÐèÒªÌí¼Ó±í¼¶Ëø£¬½«Õû¸ö±íËø¶¨£©¡£
µÚÒ»Àඪʧ¸üУºÄ¿Ç°ÕË»§Óà¶î1000Ôª£¬A¿ªÊ¼ÊÂÎñ-->B¿ªÊ¼ÊÂÎñ-->B»ãÈë100Ôª£¬Óà¶î¸ÄΪ1100Ôª-->BÌá½»ÊÂÎñ¨¤AÈ¡³ö100Ôª£¬°ÑÓà¶î¸ÄΪ900Ôª-->A³·ÏúÊÂÎñ-->Óà¶î»Ö¸´Îª1000Ôª£¨¶ªÊ§¸üУ©¡£
AÊÂÎñ³·Ïúʱ£¬°ÑBÌá½»µÄ¸üÐÂÊý¾Ý¸ø¸²¸ÇÁË¡£
µÚ¶þÀඪʧ¸üУºB¿ªÊ¼ÊÂÎñ-->A¿ªÊ¼ÊÂÎñ-->B²éѯÓà¶îΪ1000Ôª-->A²éѯÓà¶îΪ1000Ôª-->BÈ¡³ö100Ôª£¬°ÑÓà¶î¸ÄΪ900Ôª-->BÌá½»ÊÂÎñ-->A»ãÈë100Ôª-->AÌá½»ÊÂÎñ-->A°ÑÓà¶î¸ÄΪ1100Ôª£¨¶ªÊ§¸üУ©¡£
AÔÚÌá½»ÊÂÎñʱ£¬°ÑBËù×öµÄ²Ù×÷¶ªÊ§¡£
JDBC¶ÔÊÂÎñµÄÖ§³Ö

ConnectionĬÈÏÇé¿öÏÂÊÇ×Ô¶¯Ìá½»µÄ¡£
ΪÁ˰Ѷà¸öÊÂÎñµ±³ÉÒ»¸öÊÂÎñÖ´ÐУ¬¾Í±ØÐëÇ¿ÖÆ×èÖ¹×Ô¶¯Ìá½»£¨µÚÎåÐУ©¡£
µÚ¶þ»ØºÏ£ºThreadLocal
Springͨ¹ý¸÷ÖÖÄ£°åÀཱུµÍÁË¿ª·¢ÕßʹÓø÷Öֳ־ü¼ÊõµÄÄѶȡ£
ÕâЩģ°åÀà¶¼ÊÇḬ̈߳²È«µÄ¡£
Ä£°åÀàÐèÒª°ó¶¨Êý¾ÝÁ¬½Ó»òÕ߻ỰµÄ×ÊÔ´¡£
ÕâЩ×ÊÔ´±¾ÉíÊÇ·ÇḬ̈߳²È«µÄ¡£
ËäȻģ°åÀàͨ¹ý×ÊÔ´³Ø»ñÈ¡Á¬½Ó»òÕ߻Ự£¬
µ«ÊÇ×ÊÔ´³Ø½â¾öµÄÊÇÊý¾ÝÁ¬½Ó»òÕß×ÊÔ´µÄ»º´æÎÊÌ⣬
¶ø²»ÊÇḬ̈߳²È«ÎÊÌâ¡£
°´ÕÕ¹ßÀý£¬²ÉÓÃsynchronized½øÐÐÏß³Ìͬ²½¡£
µ«ÊǸÃÏß³Ìͬ²½»úÖÆ½â¾ö¾ßÌåÎÊÌâʱ£¬¿ª·¢ÄѶȴ󡢽µµÍ²¢·¢ÐÔ¡¢Ó°ÏìϵͳÐÔÄÜ¡£
ËùÒÔ£¬Ä£°åÀಢδ²ÉÓÃÏß³Ìͬ²½»úÖÆ¡£
ÄÇô£¬Ä£°åÀ྿¾¹²ÉÓÃʲô·½Ê½±£Ö¤Ḭ̈߳²È«µÄÄØ£¿
´ð°¸£ºThreadLocal£¡
ThreadLocalÊÇʲô£¿
ThreadLocal£¬¹ËÃû˼Ò壬Ëü²»ÊÇÒ»¸öỊ̈߳¬¶øÊÇÏ̵߳ÄÒ»¸ö±¾µØ»¯¶ÔÏó¡£¶àÏ̳߳ÌÐòʹÓÃThreadLocalά»¤±äÁ¿Ê±£¬Ã¿Ò»¸öÏ߳̽«Äõ½¸Ã±äÁ¿µÄÒ»¸ö¸±±¾£¬´Ó¶ø£¬Ã¿¸öÏ̶߳Ը÷×Ô±äÁ¿µÄ¸±±¾µÄ¸ü¸Ä¶¼²»»áÓ°Ïìµ½ÆäËûÏ̡߳£
Ò»¸öThreadLocalʵÀý


ÉÏÀýºÜ¼òµ¥£¬Èý¸öÏ̶߳¼Äõ½Integer¶ÔÏóµÄ¸±±¾£¬¸ÃInteger¶ÔÏóµÄ³õʼ»¯ÖµÉèÖÃΪ0£¬È»ºó¸÷×ÔÐ޸쬻¥²»Ó°Ïì¡£
³ýÁËset¡¢get¡¢initialValueÖ®Í⣬ThreadLocal»¹ÓÐÒ»¸ö·½·¨£ºremove(),¸Ã·½·¨½«µ±Ç°±äÁ¿¸±±¾´Ó¸ÃÏß³ÌÖÐɾ³ý£¬¼õÉÙÄÚ´æµÄÕ¼Óá£
ÓëThreadͬ²½»úÖÆµÄ±È½Ï
ÔÚͬ²½»úÖÆÖУ¬Í¨¹ý¶ÔÏóµÄËø»úÖÆ±£Ö¤Í¬Ò»Ê±¼äÖ»ÓÐÒ»¸öÏ̷߳ÃÎʱäÁ¿£¬¸Ã±äÁ¿ÊǶà¸öÏ̹߳²ÏíµÄ£¬ÄÇô£¬Ã¿¸öÏß³ÌÔÚʲôʱºò¿ÉÒÔ¶Ô±äÁ¿¶Áд£¬Ê²Ã´Ê±ºòÒª¶Ô¸Ã¶ÔÏó¼ÓËø£¬Ê²Ã´Ê±ºòÊͷŶÔÏóËøµÈ£¬¶¼Òª×¼È·Åжϣ¬Âß¼¸´ÔÓ£¬±àдÄѶȴó¡£
ThreadLoaclΪÿһ¸öÏß³ÌÌṩһ¸ö±äÁ¿µÄ¸±±¾£¬¸ôÀëÁ˶àÏ̷߳ÃÎÊÊý¾ÝµÄ³åÍ»¡£ThreadLocalÌṩÁËḬ̈߳²È«µÄ¶ÔÏó·â×°£¬ÔÚ±àд¶àÏ̴߳úÂëʱ£¬¿ÉÒ԰Ѳ»°²È«µÄ±äÁ¿·â×°½øThreadLocal¡£
×ÜÖ®£¬¶Ô¶àÏ̹߳²ÏíµÄÎÊÌ⣬ͬ²½»úÖÆ²ÉÓÃÁË¡±ÒÔʱ¼ä»»¿Õ¼ä£¬·ÃÎÊ´®Ðл¯£¬¶ÔÏó¹²Ïí»¯¡±¡£¶øThreadLocalÔòÊÇ¡°ÒԿռ任ʱ¼ä£¬·ÃÎʲ¢Ðл¯£¬¶ÔÏó¶ÀÏí»¯¡±¡£Ç°ÕßÖ»Ìṩһ·Ý±äÁ¿£¬Èò»Í¬µÄÏß³ÌÅŶӷÃÎÊ£¬¶øºóÕßΪÿһ¸öÏ̶߳¼ÌṩÁËÒ»·Ý±äÁ¿£¬Òò´Ë¿ÉÒÔͬʱ·ÃÎʶø»¥²»Ó°Ïì¡£
SpringÓëThreadLocal
ÓÐ״̬¾ÍÊÇÓÐÊý¾Ý´æ´¢¹¦ÄÜ¡£ÓÐ״̬¶ÔÏó(Stateful Bean)£¬¾ÍÊÇÓÐʵÀý±äÁ¿µÄ¶ÔÏ󣬿ÉÒÔ±£´æÊý¾Ý£¬ÊÇ·ÇḬ̈߳²È«µÄ¡£ÔÚ²»Í¬·½·¨µ÷Óü䲻±£ÁôÈκÎ״̬¡£


ÎÞ״̬¾ÍÊÇÒ»´Î²Ù×÷£¬²»Äܱ£´æÊý¾Ý¡£ÎÞ״̬¶ÔÏó(Stateless Bean)£¬¾ÍÊÇûÓÐʵÀý±äÁ¿µÄ¶ÔÏó.²»Äܱ£´æÊý¾Ý£¬ÊDz»±äÀ࣬ÊÇḬ̈߳²È«µÄ¡£

Ò»°ãÇé¿öÏ£¬Ö»ÓÐÎÞ״̬bean²Å¿ÉÒÔÔÚ¶àÏ̻߳·¾³Ï¹²Ïí£¨¼ÈȻûÓÐ״̬£¬²»Äܱ£´æÊý¾Ý£¬Ëæ±ã¹²ÏíÀ²£©
ÔÚspringÖУ¬¾ø´ó²¿·ÖBean¶¼¿ÉÒÔÉùÃ÷Ϊsingleton×÷ÓÃÓò¡££¨Èç¹ûÔÚ<bean>ÖÐÖ¸¶¨BeanµÄ×÷Ó÷¶Î§ÊÇ scopt="prototype",ÄÇôϵͳ½«bean·µ»Ø¸øµ÷ÓÃÕߣ¬spring¾Í²»¹ÜÁË£¨Èç¹ûÁ½¸öʵÀýµ÷Óõϰ£¬Ã¿Ò»´Îµ÷Óö¼ÒªÖØÐ³õʼ»¯£¬Ò»¸öʵ ÀýµÄÐ޸IJ»»áÓ°ÏìÁíÒ»¸öʵÀýµÄÖµ¡£Èç¹ûÖ¸¶¨BeanµÄ×÷Ó÷¶Î§ÊÇscope="singleton"£¬Ôò°Ñbean·Åµ½»º³å³ØÖУ¬²¢½«beanµÄÒýÓ÷µ»Ø ¸øµ÷ÓÃÕß¡£Õâ¸öʱºò£¬Èç¹ûÁ½¸öʵÀýµ÷Óõϰ£¬ÒòΪËüÃÇÓõÄÊÇͬһ¸öÒýÓã¬ÈκÎÒ»·½µÄÐ޸ͼ»áÓ°Ïìµ½ÁíÒ»·½¡££©£©
ÕýÒòΪSpring¶ÔһЩBean(RequestContextholder¡¢TransactionSynchronizationManager¡¢ LocaleContextHolderµÈ)ÖзÇḬ̈߳²È«µÄ¡±×´Ì¬ÐÔ¶ÔÏó¡±²ÉÓÃThreadLocal·â×°£¬ÈÃËüÃdzÉΪḬ̈߳²È«µÄ¡±×´Ì¬ÐÔ¶ÔÏó¡±£¬Òò´ËÓР״̬µÄbean¾ÍÄܹ»ÒÔsingleton·½Ê½ÔÚ¶àÏß³ÌÖÐÕý³£¹¤×÷ÁË¡£
Spring¶ÔÓÐ״̬beanµÄ¸ÄÔì˼·
·ÇḬ̈߳²È«£º

ÓÉÓÚµÚ8ÐеÄconnÊÇ·ÇḬ̈߳²È«µÄ³ÉÔ±±äÁ¿£¬
Òò´ËaddTopic()·½·¨Ò²ÊÇ·ÇḬ̈߳²È«µÄ£¬
ÿ´ÎʹÓÃʱ¶¼±ØÐëд´½¨Ò»¸öTopicDaoʵÀý(·Çsingleton)¡£
¶Ô·ÇḬ̈߳²È«µÄconn½øÐиÄÔ죺

ÉÏÀý½öΪÁ˼òµ¥ËµÃ÷ÔÀí£¬²¢²»×öÉ£¬Àý×Ó´Ö²Ú£¬²¢²»ÄÜÔÚʵ¼Ê»·¾³ÖÐʹÓ㬻¹ÓкܶàÒª¿¼ÂÇµÄÆäËûÎÊÌâ¡£
µÚÈý»ØºÏ£ºSpring¶ÔÊÂÎñ¹ÜÀíµÄÖ§³Ö
²»¹ÜÑ¡ÔñSpring JDBC,Hibernate£¬JPA»¹ÊÇiBatis£¬Spring¶¼ÈÃÎÒÃÇ¿ÉÒÔÓÃͳһµÄ±à³ÌÄ£ÐͽøÐÐÊÂÎñ¹ÜÀí¡£
SpringÊÂÎñ¹ÜÀíÓм¸¸öÖ÷ÒªµÄ³éÏó¸¸À࣬ÔÚÊÂÎñ¹ÜÀíµÄÔË×÷¹ý³ÌÖи÷˾ÆäÖ°£¬Ö÷ÒªµÄ¹¦ÄÜ£º
ÃèÊöÊÂÎñµÄ¸ôÀë¼¶±ð¡¢³¬Ê±Ê±¼ä¡¢ÊÇ·ñÖ»¶ÁµÈ¡£
¶¨ÒåÊÂÎñµÄÊôÐÔ£¬±ÈÈçÊÂÎñ¸ôÀ루µ±Ç°ÊÂÎñÓëÆäËûÊÂÎñµÄ¸ôÀë³Ì¶È£©¡¢ÊÂÎñ´«²¥¡¢ÊÂÎñ³¬Ê±¡¢Ö»¶Á״̬µÈ¡£
ÃèÊöÊÂÎñµÄ¾ßÌåÔËÐÐ״̬¡£
¶ÔÓ¦²»Í¬µÄ³Ö¾Ã»¯¼¼Êõ£¬SpringÊÂÎñ¹ÜÀí·â×°Á˾ßÌåµÄʵÏÖÀࡣÿһÖÖʵÏÖÀà¶ÔÓ¦µÄÅäÖ÷½Ê½ÓÐËù²»Í¬¡£
SpringʹÓÃThreadLocal¼¼Êõ¸ø²»Í¬Ïß³ÌÌṩ¸÷×ÔµÄÊý¾ÝÁ¬½Ó¸±±¾¡£
Springͨ¹ýÊÂÎñ´«²¥ÐÐΪÀ´´¦ÀíÊÂÎñǶÌ×µ÷ÓÃʱµÄÔË×÷¡£
SpringÉùÃ÷ʽÊÂÎñ¹ÜÀíÊÇͨ¹ýAOPʵÏֵģ¬Í¨¹ýÉùÃ÷ÐÔÐÅÏ¢£¬Spring¸ºÔð½«ÊÂÎñ¹ÜÀíÔöÇ¿Âß¼¶¯Ì¬Ö¯Èëµ½ÒµÎñ·½·¨µÄÁ¬½ÓµãÖС£ÕâЩÂß¼°üÀ¨£º»ñÈ¡Ḭ̈߳ó¶¨×ÊÔ´¡¢¿ªÊ¼ÊÂÎñ¡¢Ìá½»/»Ø¹öÊÂÎñ¡¢½øÐÐÒ쳣ת»»ºÍ´¦ÀíµÈ¡£
»ùÓÚtx/aopÃüÃû¿Õ¼äÅäÖÃÊÂÎñ£ºÔÚXMLÖÐÅäÖÃÄ¿±êÀà¡¢ÊÂÎñ¹ÜÀíÆ÷¡¢ÔöÇ¿Àà¡¢¶¨ÒåÇÐÃæ£¬ÒýÈëÔöÇ¿µÈ¡£
ʹÓÃ×¢½âÅäÖÃÉùÃ÷ʽÊÂÎñ£º@Transactional¡£
|