संदर्भ: उपयोग की गई रूपरेखा स्प्रिंग है और सभी प्रश्न JdbcTemplate के साथ चलाए जाते हैं। मैसूर सर्वर संस्करण 5.6.19 है। table
एक है InnoDB table
और चूक की तरह auto commit
और अलगाव स्तर repeatable-पढ़ने के लिए निर्धारित है।
समस्या : एक Insert
लेनदेन के अंदर होता है और select
जो एक ही डेटा सम्मिलित करता है वह डेटा नहीं देखता है। select
रन के बादinsert
और बाद insert
लेन-देन हुआ commited
।
मैंने बिन लॉग और साथ ही mysql में सामान्य लॉग सक्षम किया है। प्रासंगिक लॉग नीचे
बिन-लॉग:
SET TIMESTAMP=1438265764/*!*/;
BEGIN
/*!*/;
# at 249935389
#150730 14:16:04 server id 1 end_log_pos 249935606 CRC32 0xa6aca292 Query thread_id=40 exec_time=0 error_code=0
SET TIMESTAMP=1438265764/*!*/;
insert into user_geo_loc_latest(user_id, lat, lng) values(x,y,z) on duplicate key update lat=y, lng=z
/*!*/;
# at 249935606
#150730 14:16:06 server id 1 end_log_pos 249936255 CRC32 0x2a52c734 Query thread_id=40 exec_time=0 error_code=0
SET TIMESTAMP=1438265766/*!*/;
INSERT INTO table(txnid) VALUES ('885851438265675046')
/*!*/;
# at 249936255
#150730 14:16:06 server id 1 end_log_pos 249936514 CRC32 0x6cd85eb5 Query thread_id=40 exec_time=0 error_code=0
SET TIMESTAMP=1438265766/*!*/;
INSERT INTO table2(x) VALUES (y)
/*!*/;
# at 249936514
#150730 14:16:06 server id 1 end_log_pos 249936545 CRC32 0xceb9ec56 Xid = 9406873
COMMIT/*!*/;
क्वेरी लॉग
150730 14:16:04 40 Query ...
....
40 Query select count(*) from table where txnid = '885851438265675046'
40 Query select @@session.tx_read_only
40 Query INSERT INTO table(txnid) VALUES ('885851438265675046')
40 Query select @@session.tx_read_only
40 Query INSERT INTO table2(x) values(y)
40 Query commit
....
150730 14:16:07 36 Query select pp.*, b.create_date from table pp left join bill b on pp.bill_id = b.bill_id where pp.txnid = '885851438265675046'
उत्सुकता से, पहले insert
(249935389) लेनदेन का हिस्सा बिल्कुल नहीं होना चाहिए। यह एक अलग एपीआई कॉल और पूरी तरह से असंबंधित है। यह लेन-देन के साथ वसंत का मिश्रण हो सकता है या मैं लॉग को गलत पढ़ रहा हूं? AFAIK के बाद से यह एक ही धागे पर है इसका मतलब यह है कि लेनदेन लेनदेन में है।
अगले दो inserts
लेन-देन का हिस्सा हैं और ऐसा लगता है कि यह कमिट करता है। (249,936,514)। अब चयन क्वेरी (सामान्य लॉग में अंतिम) कमिट के बाद चलती है और यह डेटा नहीं देखती है। यह 0 पंक्तियों को लौटाता है। डेटा को देखते हुए ऐसा कैसे हो सकता है committed
? या commit
धागा 40 पर नहीं है? चूंकि इसमें थ्रेड आईडी नहीं है।
संक्षेप में, मेरे दो प्रश्न हैं।
क्या
BEGIN
बिनलॉग से पहले होता हैINSERT INTO user_geo_loc
(जो लेन-देन का हिस्सा नहीं है), क्या यह वसंत / Jdbc या MySql के साथ एक बग है, जैसा कि यह जानता है कि यह लेनदेन पहले से ही प्रतिबद्ध है (क्योंकि लेन-देन के बारे में लिखा है सफल) और इसलिए कभी पीछे नहीं हटेगा।यह देखते हुए कि कमिट से पहले होता है (कमेटी 14:16:06 पर है और सेलेक्ट 14:16:07 पर है) यह कैसे होता है कि सेलेक्शन ट्रांजेक्शन द्वारा डाली गई पंक्ति को वापस नहीं करता है?
यह बेहद हैरान करने वाला है। किसी भी सहायता की सराहना की जाएगी
नोट: संवेदनशील जानकारी को निकालने के लिए बिन और क्वेरी लॉग दोनों में प्रश्नों को संपादित किया गया है। लेकिन प्रश्नों का सार वही रहता है
संपादित करें: सामान्य लॉग और क्वेरी लॉग के साथ विस्तृत उदाहरण के साथ अपडेट किया गया।
BEGIN
या START TRANSACTION
। क्या आप इसके बजाय, उपयोग कर रहे हैं autocommit=0
? (मुझे पसंद है ... शुरू करें; यह लेनदेन की सीमा को स्पष्ट करता है।)