মাইএসকিউএল Commated ডেটা কোয়েরি নির্বাচন করতে দেখা যায় নি


13

প্রসঙ্গ: ব্যবহৃত ফ্রেমওয়ার্কটি স্প্রিং এবং সমস্ত ক্যোয়ারী জেডিবিসিটাইপ্লেট দিয়ে চালিত হয়। মাইএসকিএল সার্ভার সংস্করণটি 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 এ নেই? যেহেতু এটিতে থ্রেড আইডি নেই।

সংক্ষেপে আমার দুটি প্রশ্ন আছে।

  1. BEGINবাইনলগের মধ্যে কি INSERT INTO user_geo_loc(যা লেনদেনের অংশ নয়) এর আগে বসন্ত / জেডিবিসি বা মাই এসকিএল সহ একটি বাগটি কেবল এটি করে কারণ এটি জানে যে এই লেনদেনটি ইতিমধ্যে প্রতিশ্রুতিবদ্ধ হয়েছে (যেমন লেনদেনগুলি বিনলগে লিখিত হয় যখন তারা আছে সফল) এবং তাই আর ফিরে ঘুরিয়ে দেওয়া হবে না।

  2. প্রতিশ্রুতিবদ্ধ নির্বাচনের আগে ঘটে (প্রদত্ত প্রতিশ্রুতি 14:16:06 এ আছে এবং নির্বাচন 14:16:07 এ রয়েছে) এটি কীভাবে হয় যে নির্বাচনটি লেনদেনের মাধ্যমে সন্নিবেশিত সারিটি ফেরত দেয় না?

এটি অত্যন্ত বিভ্রান্তিকর। কোন সাহায্য প্রশংসা করা হবে

দ্রষ্টব্য: সংবেদনশীল তথ্য মুছে ফেলার জন্য বিন এবং ক্যোয়ারী উভয় লগের অনুসন্ধানগুলি সম্পাদনা করা হয়েছে। কিন্তু প্রশ্নের সারমর্ম একই থাকে

সম্পাদনা: একটি সাধারণ উদাহরণ সহ সাধারণ লগ এবং ক্যোয়ারী লগ সহ আপডেট হয়েছে।


আপনি এটি 5.5 ট্যাগ করেছেন, তবে উল্লেখ করেছেন 5.6; ইহা কোনটা? প্রতিলিপি জড়িত?
রিক জেমস

@ রিক জেমস দুঃখিত, এটি 5.6.19। আমি প্রশ্ন এবং বিন লগ উভয়ই উদাহরণ সহ প্রশ্নটি আপডেট করেছি। এছাড়াও এর সাথে জড়িত কোনও প্রতিলিপি নেই যা আমি বিন লগটি সমস্যাটি ডিবাগ করার জন্য লক্ষ্য করেই চালু করেছিলাম। ধন্যবাদ
আহমেদ অয়ন এক্সান

ধন্যবাদ, যে সাহায্য করে। আমি একটি BEGINবা দেখতে পাচ্ছি না START TRANSACTION। আপনি, পরিবর্তে, ব্যবহার করছেন autocommit=0? (আমি শুরু করতে পছন্দ করি ... প্রতিশ্রুতিবদ্ধ; এটি লেনদেনের পরিমাণটি পরিষ্কার করে দেয়))
রিক জেমস

সুতরাং কাঠামো (বসন্ত) লেনদেন পরিচালনা করে এবং এটি সাধারণত অটোকোমিট = 0 সেট করে এবং শেষে প্রতিশ্রুতি দেয়। আমি অনুমান করছি যে আমরা এখানে অটোক্যামিট = 0 দেখতে পাচ্ছি না কারণ সংযোগটি ইতিমধ্যে সেই অবস্থায় ছিল।
আহমেদ অয়ন এক্সান

উত্তর:


3

আমি দ্বিতীয় প্রশ্নটি নিয়ে অনুমান করার চেষ্টা করি:

প্রতিশ্রুতিবদ্ধ নির্বাচনের আগে ঘটে (প্রদত্ত প্রতিশ্রুতি 14:16:06 এ আছে এবং নির্বাচন 14:16:07 এ রয়েছে) এটি কীভাবে হয় যে নির্বাচনটি লেনদেনের মাধ্যমে সন্নিবেশিত সারিটি ফেরত দেয় না?

লেনদেনগুলি বসন্ত দ্বারা পরিচালিত হয়। সুতরাং এটি সম্ভব হবে যে selectবসন্ত চালানোর আগে একটি উত্থাপিত হয়েছিল start transactionবা এটি ইতিমধ্যে অন্য কোয়েরি চালানোর জন্য সংযোগটি ব্যবহার করেছে।

আমি প্রথম সেশনটি শুরু করি যেখানে আমি একটি সারণিতে একটি সন্নিবেশ অনুকরণ করি t:

session1> create table t (i int auto_increment primary key);
Query OK, 0 rows affected (0,32 sec)

session1> insert into t values();
Query OK, 1 row affected (0,00 sec)

session1> select * from t;
+---+
| i |
+---+
| 1 |
+---+
1 row in set (0,00 sec)

session1> start transaction;
Query OK, 0 rows affected (0,00 sec)

session1> insert into t values();
Query OK, 1 row affected (0,00 sec)

আমি একটি নতুন অধিবেশন তৈরি করি, সেশন 2, যেখানে autocommit0 তে সেট করা আছে এই নতুন অধিবেশনে, একটি নির্বাচন চালানোর সময় স্পষ্টভাবে একটি লেনদেন শুরু হয়।

session2> set autocommit = 0;
Query OK, 0 rows affected (0,00 sec)

session2> select * from t;  -- this starts a transaction
+---+
| i |
+---+
| 1 |
+---+
1 rows in set (0,00 sec)

সন্নিবেশ প্রতিশ্রুতিবদ্ধ করতে সেশন 1 এ সরান।

session1> commit;

এখন আবার সেশন 2 এ যান:

session2> select * from t;
+---+
| i |
+---+
| 1 |
+---+
1 row in set (0,00 sec)

সেশন 2 সারিটি সন্নিবেশ করা দেখতে পাচ্ছে না। যদি commitসেশন 2-এ উত্থাপিত হয় তবে আমরা সেশন 1-তে নতুন সারি .োকানো দেখতে পাচ্ছি

session2> commit
1 row in set (0,00 sec)

session2> select * from t;
+---+
| i |
+---+
| 1 |
| 2 |
+---+
2 rows in set (0,00 sec)

সাধারণ লগ মত দেখাচ্ছে:

150804 14:04:10     2 Query select * from t

150804 14:04:30     1 Query start transaction
150804 14:04:39     1 Query insert into t values ()
150804 14:04:44     1 Query commit
150804 14:04:51     2 Query select * from t

150804 14:05:07     2 Query commit
150804 14:05:10     2 Query select * from t

প্রথম সারিটি 2 সেশন সম্পর্কিত It এটি যখন সেশন 2 লেনদেনটি খুলবে।

আমি জানি না আপনার ক্ষেত্রে এটি কি ঘটে? আপনি যদি আপনার সাধারণ লগটি পরীক্ষা করতে পারেন তবে সংযোগ_id 36 অন্যান্য প্রশ্নের জন্য ব্যবহার করা হয়েছিল। আমাদের জানাবেন।

আমাদের সাইট ব্যবহার করে, আপনি স্বীকার করেছেন যে আপনি আমাদের কুকি নীতি এবং গোপনীয়তা নীতিটি পড়েছেন এবং বুঝতে পেরেছেন ।
Licensed under cc by-sa 3.0 with attribution required.