eXtremeDB采用行级锁latches,是用原子操作实现的一种轻量级的高效的锁。
    MVCC事务管理器可以并发运行读写事务。由于latches存在,当并发的事务更新同一个对象时,容易出现事务冲突,MVCC事务管理器会让一个事务完成更新操作,而其它的事务被中止,并返回应用程序MCO_E_CONFLICT。应用程序可以判断返回的错误码来解决冲突:

点击(此处)折叠或打开

  1. do {
  2.     mco_trans_start( db,
  3.                      MCO_READ_WRITE,
  4.                      MCO_TRANS_FOREGROUND,
  5.                      &t);
  6.  
  7.     ...<update database>...
  8.  
  9.     rc = mco_trans_commit(t);
  10. } while ( rc == MCO_E_CONFLICT );
    如果并发的事务量非常大的时候,大量的冲突会导致应用程序性能降低。而这时候,MVCC事务管理器会临时将隔离级别改为MCO_SERIALIZABLE。在C/C++应用程序中,可以通过下面的函数来设置冲突的阀值。

点击(此处)折叠或打开

  1. void mco_trans_optimistic_threshold( mco_db_h db,
  2.                                      int max_conflicts_percent,
  3.                                      int disable_period)
    当冲突的事务数量超过设置的阀值,事务管理器将隔离级别改为MCO_SERIALIZABLE。默认值为100,意味着无论有多少事务冲突都不会有存在这个阀值。
09-07 16:16