sqlite本身的事务并不支持嵌套,而savepoint方法虽然支持嵌套,但是,使用起来比较复杂。下面,提供一种针对线程数据库连接的事务嵌套模式,如果是在单线程中操作数据库,则可以进一步简化实现 (采用静态变量保存事务计数即可)。
在代码中,使用了windows下的线程槽的概念,其是针对每个线程保留单独的一份数据。
#include "sqlite3.h"
/**
* @class LockHelp
* @brief a lock class
*/
class CLockHelp
{
public:
CLockHelp()
{
::InitializeCriticalSection(&m_CriticalSection);
}
~CLockHelp()
{
::DeleteCriticalSection(&m_CriticalSection);
}
/// lock
void lock()
{
::EnterCriticalSection(&m_CriticalSection);
}
/// unlock
void unlock()
{
::LeaveCriticalSection(&m_CriticalSection);
}
private:
CLockHelp(const NLock&);
CLockHelp& operator=(const NLock&);
private:
CRITICAL_SECTION m_CriticalSection;
};
/**
* @class CTransaction
*