在MySql的写语句中,给表列赋值与表范例不符应时,MySql底层的优化器发挥作用,会做一个强迫范例转化,此时能一般操纵,但会致使行锁升级为表锁。示例以下
翻开两个session会话窗口,并把两个会话窗口中的MySql的自动提交形式改成手动提交
>set autocommit=false;
在会话窗口1中实行更新语句,但不提交事件。age列在建表时指定的是int范例,此地更新语句顶用字符串’100’举行赋值,在MySql的优化器中会自动把字符串’100’强迫转化为整形100,然后再实行SQL检索。
>update student set class=3 where age='100'
然后再会话窗口2中对别的没紧要的数据实行更新操纵
>update student set age=28 where name='lzj';
一般情况下,两条SQL语句操纵的行数据差别,实行起来会互不影响,但现实会话1中的更新操纵壅塞了会话2中的更新操纵
会话1中实行了更新操纵,但没有实行事件提交,事件的断绝级别为Read Committed,所以在会话2中还看不到会话1中更新后的效果。但在回话2中实行对别的行数据更新操纵时,涌现了壅塞。可见会话1中的SQL语句的赋值涌现了强转,致使会话1由行锁升级为表锁,锁住了全部student表,因此会话2中的SQL壅塞。下面临会话1中的更新操纵实行事件提交,那末会话2中的更新操纵就会继承实行了
对会话1中的更新操纵实行commit
手动提交事件后,会话1释放掉student的表锁,会话2中的更新操纵能够继承实行。
末了对会话2中的更新也实行commit
事件提交,两条SQL都更新终了,student表内容以下:
从上述案例观知,SQL语句赋值与表列范例不婚配时,MySql的优化器强迫转化为婚配的范例,致使行锁升级为表锁。所以开辟中一定要注重范例的婚配,防止行锁升级为表锁,影响并发机能。
相干引荐:
MySQL行级锁、表级锁、页级锁细致引见
MySQL锁的用法之表级锁
以上就是MySql范例转换致使行锁升级为表锁的细致内容,更多请关注ki4网别的相干文章!