প্রসঙ্গ: ব্যবহৃত ফ্রেমওয়ার্কটি স্প্রিং এবং সমস্ত ক্যোয়ারী জেডিবিসিটাইপ্লেট দিয়ে চালিত হয়। মাইএসকিএল সার্ভার সংস্করণটি 5.6.19। এটি table
হ'ল একটি InnoDB table
এবং ডিফল্ট auto commit
এবং বিচ্ছিন্ন স্তরের পুনরাবৃত্তিযোগ্য-পঠন সেট করা হয়।
সমস্যা : Insert
একটি লেনদেনের ভিতরে একটি ঘটনা ঘটে এবং select
যা একই তথ্য সন্নিবেশ করায় তা ডেটা দেখতে পায় না। select
রান পরinsert
পর insert
লেনদেন হয়েছে commited
।
আমি বিন লগের পাশাপাশি মাইএসকিএলে সাধারণ লগ সক্ষম করেছি enabled নীচে প্রাসঙ্গিক লগ
বিন-লগ:
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) মোটেও লেনদেনের অংশ হওয়া উচিত নয়। এটি একটি পৃথক এপিআই কল এবং সম্পূর্ণ সম্পর্কিত নয়। এটি লেনদেনের সাথে মিশ্রণ বসন্ত হতে পারে বা আমি লগটি ভুল করে পড়ছি? আফাইক এটি যেহেতু একই থ্রেডে এটি বোঝায় যে সন্নিবেশ সঞ্চারিত হয়।
পরবর্তী দুটি inserts
লেনদেনের অংশ এবং দেখে মনে হচ্ছে এটি কমিট করে। (249936514)। এখন নির্বাচিত ক্যোয়ারী (সর্বশেষ সাধারণ লগের একটি) কমিটের পরে চলে এবং এটি ডেটা দেখতে পায় না। এটি 0 টি সারি প্রদান করে। এটি ডেটা বিবেচনা করে কীভাবে ঘটতে পারে committed
? নাকি commit
থ্রেড 40 এ নেই? যেহেতু এটিতে থ্রেড আইডি নেই।
সংক্ষেপে আমার দুটি প্রশ্ন আছে।
BEGIN
বাইনলগের মধ্যে কিINSERT INTO user_geo_loc
(যা লেনদেনের অংশ নয়) এর আগে বসন্ত / জেডিবিসি বা মাই এসকিএল সহ একটি বাগটি কেবল এটি করে কারণ এটি জানে যে এই লেনদেনটি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ হয়েছে (যেমন লেনদেনগুলি বিনলগে লিখিত হয় যখন তারা আছে সফল) এবং তাই আর ফিরে ঘুরিয়ে দেওয়া হবে না।প্রতিশ্রুতিবদ্ধ নির্বাচনের আগে ঘটে (প্রদত্ত প্রতিশ্রুতি 14:16:06 এ আছে এবং নির্বাচন 14:16:07 এ রয়েছে) এটি কীভাবে হয় যে নির্বাচনটি লেনদেনের মাধ্যমে সন্নিবেশিত সারিটি ফেরত দেয় না?
এটি অত্যন্ত বিভ্রান্তিকর। কোন সাহায্য প্রশংসা করা হবে
দ্রষ্টব্য: সংবেদনশীল তথ্য মুছে ফেলার জন্য বিন এবং ক্যোয়ারী উভয় লগের অনুসন্ধানগুলি সম্পাদনা করা হয়েছে। কিন্তু প্রশ্নের সারমর্ম একই থাকে
সম্পাদনা: একটি সাধারণ উদাহরণ সহ সাধারণ লগ এবং ক্যোয়ারী লগ সহ আপডেট হয়েছে।
BEGIN
বা দেখতে পাচ্ছি না START TRANSACTION
। আপনি, পরিবর্তে, ব্যবহার করছেন autocommit=0
? (আমি শুরু করতে পছন্দ করি ... প্রতিশ্রুতিবদ্ধ; এটি লেনদেনের পরিমাণটি পরিষ্কার করে দেয়))