I have table "tbl_data", where have a lot of rows (3 – 5 million).
I have JAVA (*.jar) module from which I INSERT/UPDATE data into this table.
If I start *.jar file (for example, "run.jar") and after INSERT/UPDATE process I start "run.jar" sequentially, there no problems – works OK.
If I start "run.jar" and then start "run_01.jar" (jar file with the similar logic: INSERT/UPDATE into "tbl_data"), I can get error:
com.mysql.jdbc.exceptions.jdbc4.MySQLTransactionRollbackException:
Deadlock found when trying to get lock; try restarting transaction
All actions at "run.jar" executes in transaction, like:
START TRANSACTION;
INSERT INTO tbl_data …;
UPDATE tbl_data …;
COMMIT;
So, I need to have ability make INSERT/UPDATE from several sources at the same time without blocking table for modification (Every jar file UPDATES/INSERTS its own rows in "tbl_data" so it is no problem for data in modification data at the same time).
Best Answer
If you are totally sure about the separation status of your data, you can set the global isolation level to
READ COMMITTED
or even toREAD UNCOMMITTED
. The first blocks less from the index, which should be enough in your case. The second one arranges for allSELECT
statements to be non blocking. This is as low as you can go.Whatever you choose, you should set the global isolation level back to
REPEATABLE READ
as soon as you finished inserting your data.global
means that this applies to all connections, which are established. So this change also affects connections beside yourjar
files. If you have the possibility to change thejar
files, you should set the connection based isolation level with theSESSION
keyword instead in bothjar
files.