Bağlam: Kullanılan çerçeve İlkbahar'dır ve tüm sorgular JdbcTemplate ile çalıştırılır. Mysql Server sürümü 5.6.19'dur. table
Bir olduğunu InnoDB table
ve varsayılan gibi auto commit
yalıtım düzeyi tekrarlanabilir okunan ayarlanır ve.
Sorun : Bir Insert
işlemin içinde gerçekleşen ve select
eklenen aynı verileri okuyan bir veri verileri görmüyor. select
İshal sonrasıinsert
ve sonrası insert
işlem vardır commited
.
Ben mysql genel oturum yanı sıra bin günlüğü etkinleştirdim. Alakalı günlükler
Bin-log:
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/*!*/;
Sorgu Günlüğü
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'
İlginçtir ki, İlk insert
(249935389) işlemin bir parçası olmamalıdır. Ayrı bir API çağrısıdır ve tamamen ilgisizdir. Bu işlem ile bahar karıştırma olabilir ya da günlüğü yanlış okuyorum? AFAIK aynı iş parçacığında olduğundan ekin işlemde olduğu anlamına gelir.
Sonraki ikisi inserts
işlemin bir parçası ve işlem görüyor gibi görünüyor. (249.936.514). Şimdi seçme sorgusu (genel günlükte sonuncusu) işlemden sonra çalışır ve verileri görmez. 0 satır döndürür. Veriler dikkate alındığında bu nasıl olabilir committed
? Yoksa commit
iplik 40'da değil mi? İş parçacığı kimliği olmadığından.
Özetlemek gerekirse iki sorum var.
Does
BEGIN
önce binlog varlıktaINSERT INTO user_geo_loc
(işlemin bir parçası değil), bu bahar / JDBC veya MySQL ile bir hata olduğunu basitçe işlemler onlar olmasa da bunu binlog yazılır gibi (bu işlem zaten işlediği bilir bunu yapar başarılı olur) ve bu nedenle asla geri alınmaz.Taahhüt, seçimden önce gerçekleştiği göz önüne alındığında (kesinleştirme 14:16:06 ve seçim 14:16:07 saatindedir), seçimin işlem tarafından eklenen satırı döndürmemesi nasıl olur?
Bu son derece şaşırtıcı. Herhangi bir yardım mutluluk duyacağız
Not: Bölme ve sorgu günlüğündeki sorgular hassas bilgileri kaldırmak için düzenlenmiştir. Ancak sorguların özü aynı kalır
Düzenleme: Ayrıntılı bir örnekle genel günlük ve sorgu günlüğü ile güncellendi.
BEGIN
veya görmüyorum START TRANSACTION
. Bunun yerine kullanıyor autocommit=0
musunuz? (Başlamayı tercih ederim ... taahhüt; işlemin kapsamını netleştirir.)