设为首页 - 加入收藏 ASP站长网(Aspzz.Cn)- 科技、建站、经验、云计算、5G、大数据,站长网!
热搜: 重新 试卷 创业者
当前位置: 首页 > 运营中心 > 建站资源 > 优化 > 正文

Sqlite事务模型、性能优化Tips、常见误区(3)

发布时间:2019-09-26 10:09 所属栏目:21 来源:hamsongliu
导读:如果CoreMutex打开,则会设置全局的锁控制函数 /*IfthexMutexAllocmethodhasnotbeenset,thentheuserdidnot **installamuteximplementationviasqlite3_config()priorto **sqlite3_initialize()beingcalled.Thisblock

如果CoreMutex打开,则会设置全局的锁控制函数

  1. /* If the xMutexAlloc method has not been set, then the user did not 
  2.     ** install a mutex implementation via sqlite3_config() prior to  
  3.     ** sqlite3_initialize() being called. This block copies pointers to 
  4.     ** the default implementation into the sqlite3GlobalConfig structure. 
  5.     */ 
  6.     sqlite3_mutex_methods const *pFrom; 
  7.     sqlite3_mutex_methods *pTo = &sqlite3GlobalConfig.mutex; 
  8.  
  9.     if( sqlite3GlobalConfig.bCoreMutex ){ 
  10.       pFrom = sqlite3DefaultMutex(); 
  11.     }else{ 
  12.       pFrom = sqlite3NoopMutex(); 
  13.     } 
  14.     pTo->xMutexInit = pFrom->xMutexInit; 
  15.     pTo->xMutexEnd = pFrom->xMutexEnd; 
  16.     pTo->xMutexFree = pFrom->xMutexFree; 
  17.     pTo->xMutexEnter = pFrom->xMutexEnter; 
  18.     pTo->xMutexTry = pFrom->xMutexTry; 
  19.     pTo->xMutexLeave = pFrom->xMutexLeave; 
  20.     pTo->xMutexHeld = pFrom->xMutexHeld; 
  21.     pTo->xMutexNotheld = pFrom->xMutexNotheld; 
  22.     sqlite3MemoryBarrier(); 
  23.     pTo->xMutexAlloc = pFrom->xMutexAlloc; 
  • 而CoreMutext未打开的话,sqlite3NoopMutex()的实现如下(CoreMutext未打开的话,对应使用的锁函数均为空实现):
  1. sqlite3_mutex_methods const *sqlite3NoopMutex(void){ 
  2.   static const sqlite3_mutex_methods sMutex = { 
  3.     noopMutexInit, 
  4.     noopMutexEnd, 
  5.     noopMutexAlloc, 
  6.     noopMutexFree, 
  7.     noopMutexEnter, 
  8.     noopMutexTry, 
  9.     noopMutexLeave, 
  10.     0, 
  11.     0, 
  12.   }; 
  13.  
  14.   return &sMutex; 
  15.  
  16. // CoreMutext未打开的话,对应使用的锁函数均为空实现 
  17. static int noopMutexInit(void){ return SQLITE_OK; } 
  18. static int noopMutexEnd(void){ return SQLITE_OK; } 
  19. static sqlite3_mutex *noopMutexAlloc(int id){  
  20.   UNUSED_PARAMETER(id); 
  21.   return (sqlite3_mutex*)8;  
  22. static void noopMutexFree(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } 
  23. static void noopMutexEnter(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } 
  24. static int noopMutexTry(sqlite3_mutex *p){ 
  25.   UNUSED_PARAMETER(p); 
  26.   return SQLITE_OK; 
  27. static void noopMutexLeave(sqlite3_mutex *p){ UNUSED_PARAMETER(p); return; } 
  • FullMutex保护了什么?

粗略看了一下,通过db->mutex(sqlite3_mutex_enter(db->mutex);)保护的逻辑块和函数主要如下列表:

  1. sqlite3_db_status、sqlite3_finalize、sqlite3_reset、sqlite3_step、sqlite3_exec、 
  2. sqlite3_preppare_v2、column_name、blob操作、sqlite3Close、sqlite3_errmsg... 

基本覆盖了所有的读、写、DDL、DML,也包括prepared statement操作;也就是说,在未打开FullMutex的情况下,在一个连接上的所有DB操作必须严格串行执行,包括只读操作。

  • CoreMutex保护了什么?

sqlite3中的mutex操作函数,除了用于操作db->mutex这个成员之外,还主要用于以下逻辑块(主要是影响数据库所有连接的逻辑):

shm操作(index for wal)、内存池操作、内存缓存操作等

(编辑:ASP站长网)

网友评论
推荐文章
    热点阅读