这篇文章主要介绍“怎么理解MySQL中的Waiting for commit lock”,在日常操作中,相信很多人在怎么理解MySQL中的Waiting for commit lock问题上存在疑惑,小编查阅了各式资料,整理出简单好用的操作方法,希望对大家解答”怎么理解MySQL中的Waiting for commit lock”的疑惑有所帮助!接下来,请跟着小编一起来学习吧!

哪里控制了sql_safe_updates的逻辑,源码如下:

boolmulti_delete_precheck(THD*thd,TABLE_LIST*tables){SELECT_LEX*select_lex=thd->lex->select_lex;TABLE_LIST*aux_tables=thd->lex->auxiliary_table_list.first;TABLE_LIST**save_query_tables_own_last=thd->lex->query_tables_own_last;DBUG_ENTER("multi_delete_precheck");/*sql_yaccguaranteesthattablesandaux_tablesarenotzero*/DBUG_ASSERT(aux_tables!=0);if(check_table_access(thd,SELECT_ACL,tables,FALSE,UINT_MAX,FALSE))DBUG_RETURN(TRUE);/*Sinceaux_tableslistisnotpartofLEX::query_tableslistwehavetojugglewithLEX::query_tables_own_lastvaluetobeablecallcheck_table_access()safely.*/thd->lex->query_tables_own_last=0;if(check_table_access(thd,DELETE_ACL,aux_tables,FALSE,UINT_MAX,FALSE)){thd->lex->query_tables_own_last=save_query_tables_own_last;DBUG_RETURN(TRUE);}thd->lex->query_tables_own_last=save_query_tables_own_last;if((thd->variables.option_bits&OPTION_SAFE_UPDATES)&&!select_lex->where_cond())//这里检查是否开启了参数同时没有where条件{my_message(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE,ER(ER_UPDATE_WITHOUT_KEY_IN_SAFE_MODE),MYF(0));//报错DBUG_RETURN(TRUE);}DBUG_RETURN(FALSE);}

简单记录一下功能:

SQL_SAFE_UPDATES = 1时,不带where和limit条件的update和delete操作语句是无法执行的,即使是有where和limit条件但不带key column的update和delete也不能执行。

SQL_SAFE_UPDATES =0时,update和delete操作将会顺利执行。

到此,关于“怎么理解MySQL中的Waiting for commit lock”的学习就结束了,希望能够解决大家的疑惑。理论与实践的搭配能更好的帮助大家学习,快去试试吧!若想继续学习更多相关知识,请继续关注亿速云网站,小编会继续努力为大家带来更多实用的文章!