コンテキスト:使用されるフレームワークはSpringであり、すべてのクエリはJdbcTemplateで実行されます。Mysqlサーバーのバージョンは5.6.19です。table
でありInnoDB table
、デフォルトのようなauto commit
分離レベル反復-読み取りが設定されていると。
問題:Insert
トランザクション内で発生し、select
挿入された同じデータを読み取ると、データが表示されません。select
実行した後insert
とした後、insert
トランザクションが持ちますcommited
。
mysqlでbinログと一般ログを有効にしました。以下の関連ログ
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/*!*/;
クエリログ
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)はトランザクションの一部であってはなりません。これは別個のAPI呼び出しであり、完全に無関係です。それはトランザクションと春の混合である可能性がありますか、ログを間違って読んでいますか?AFAIKは同じスレッド上にあるため、挿入がトランザクション内にあることを意味します。
次の2つinserts
はトランザクションの一部であり、コミットするように見えます。(249936514)。現在、選択クエリ(一般ログの最後のクエリ)はコミット後に実行され、データは表示されません。0行を返します。データを考慮すると、これはどのように起こりcommitted
ますか またはcommit
、スレッド40にないのですか?スレッドIDがないため。
要約すると、2つの質問があります。
い
BEGIN
の前にビンログビーイング中にINSERT INTO user_geo_loc
、彼らがきた時にトランザクションがビンログに書かれている通り(それは、このトランザクションはすでにコミットしている知っているとして、これは春/ JDBCまたはMySQLでバグですが、単純にこれを行い、(トランザクションの一部ではないです)成功したため、ロールバックされません。選択の前にコミットが発生するとします(コミットは14:16:06で、選択は14:16:07にあります)。selectがトランザクションによって挿入された行を返さないのはどうですか?
これは非常に困惑しています。助けていただければ幸いです
注:ビンとクエリログの両方のクエリは、機密情報を削除するために編集されています。しかし、クエリの本質は同じままです
編集:一般的なログとクエリログで更新され、詳細な例があります。
BEGIN
またはが表示されませんSTART TRANSACTION
。代わりに、使用していautocommit=0
ますか?(開始すること