MySQL thread id 822, OS thread handle 0x3878, query id 369993677 localhost 127.0.0.1 root updating UPDATE T00_StringDisplayed SET CurrentOut = 0.00, VoltOut = 312.00, PowerOut = 0.00, Updated = NOW() WHERE String_ID = 756;MySQL thread id 824,的sql为:UPDATE T00_StringDisplayed SET StatusCode = 0, CodeArray = '', Updated = NOW() WHERE String_ID = 800;应该是两个数据在同一个索引块上面,所以被锁住了,两个都是X锁。 看到2个sql在同一个事务( trx id 708)里面。表面上看,无从下手,这2条update的sql语句都蛮简单的。楼主你提到的那个复杂的sql也在这个事务里面吗?贴出来,看看。
楼上好。 那个复杂的select sql在事务2里面,做完select, 然后去update. 事务2存在两次更新同一条数据的sql. 项目用了ibatis, 来管理事务。 另,您提到的索引块,是什么概念? update的时候,innodb是锁行,还是锁 索引块。另,据我的理解,没有S锁的时候,应该不会产生deadlock. 不知对否请赐教---------------------------------------------------------------------------------------------------------------------------------------------------------- SELECT M.ID, M.PowerStation_ID, IFNULL(T1.CodeArray, '') AS CodeArray, IFNULL(T1.CurrentOut < (T2.AvgCurrentOut * (SELECT ParamterValue FROM M_Paramters WHERE PowerStation_ID = M.PowerStation_ID AND ParamterName = 'StringStandarCurrentOutLevel2')), 0) AS Level2, IFNULL(T1.CurrentOut < (T2.AvgCurrentOut * (SELECT ParamterValue FROM M_Paramters WHERE PowerStation_ID = M.PowerStation_ID AND ParamterName = 'StringStandarCurrentOutLevel1')), 0) AS Level1, '1000' AS Level1Code, '1001' AS Level2Code FROM M_String AS M LEFT JOIN T00_StringDisplayed AS T1 ON M.ID = T1.String_ID LEFT JOIN (SELECT M.Case_ID, AVG(T.CurrentOut) AS AvgCurrentOut FROM T00_StringDisplayed AS T, M_String AS M WHERE T.String_ID = M.ID GROUP BY M.Case_ID) AS T2 ON M.Case_ID = T2.Case_ID WHERE M.StringStatus = '正常' AND M.PowerStation_ID IN (#PowerStationList#);
UPDATE T00_StringDisplayed SET CurrentOut = 0.00, VoltOut = 312.00, PowerOut = 0.00, Updated = NOW() WHERE String_ID = 756;MySQL thread id 824,的sql为:UPDATE T00_StringDisplayed SET StatusCode = 0, CodeArray = '', Updated = NOW() WHERE String_ID = 800;应该是两个数据在同一个索引块上面,所以被锁住了,两个都是X锁。
看到2个sql在同一个事务( trx id 708)里面。表面上看,无从下手,这2条update的sql语句都蛮简单的。楼主你提到的那个复杂的sql也在这个事务里面吗?贴出来,看看。
那个复杂的select sql在事务2里面,做完select, 然后去update. 事务2存在两次更新同一条数据的sql.
项目用了ibatis, 来管理事务。 另,您提到的索引块,是什么概念? update的时候,innodb是锁行,还是锁 索引块。另,据我的理解,没有S锁的时候,应该不会产生deadlock. 不知对否请赐教----------------------------------------------------------------------------------------------------------------------------------------------------------
SELECT M.ID, M.PowerStation_ID, IFNULL(T1.CodeArray, '') AS CodeArray, IFNULL(T1.CurrentOut < (T2.AvgCurrentOut * (SELECT ParamterValue FROM M_Paramters WHERE PowerStation_ID = M.PowerStation_ID AND ParamterName = 'StringStandarCurrentOutLevel2')), 0) AS Level2, IFNULL(T1.CurrentOut < (T2.AvgCurrentOut * (SELECT ParamterValue FROM M_Paramters WHERE PowerStation_ID = M.PowerStation_ID AND ParamterName = 'StringStandarCurrentOutLevel1')), 0) AS Level1, '1000' AS Level1Code, '1001' AS Level2Code
FROM M_String AS M
LEFT JOIN T00_StringDisplayed AS T1
ON M.ID = T1.String_ID
LEFT JOIN (SELECT M.Case_ID, AVG(T.CurrentOut) AS AvgCurrentOut FROM T00_StringDisplayed AS T, M_String AS M WHERE T.String_ID = M.ID GROUP BY M.Case_ID) AS T2
ON M.Case_ID = T2.Case_ID
WHERE M.StringStatus = '正常' AND M.PowerStation_ID IN (#PowerStationList#);
回答:通过索引块来锁定行记录。
打算每个update语句后面,都加个commit;
不知道能不能解决
打算每个update语句后面,都加个commit;
不知道能不能解决可以试试看,不够不建议这样做。另外 : 那个复杂的select sql在事务2里面,做完select, 然后去update. 事务2存在两次更新同一条数据的sql.
项目用了ibatis, 来管理事务。2个sql可以不可以合并成一个sql来操作?