如何用C++实现事务。高分在线等待!!

dfliu 2004-01-12 01:49:10
我想实现类似数据库的事务管理,在网上找了许多但都是如何操作的,有谁知道如何编程实现?或者能提供一些这方面的资料?
要求功能:
1:实现事务基本功能(提交事务,回滚等)
2:要考虑效率问题,不能太慢。
3:最好在内存中操作,避免频繁I/O操作。
4:事务可以嵌套。

我目前的做法是
1:程序启动前预先创建几个相同大小内存块,用来每次进入事务备份数据(除第一块外,不够时再动态分配)。程序的new操作符被重载,用来在第一个内存块中分配空间。
2:进入第一个事务块时,用第二块内存备份第一块内存,如果在正常离开第一个事务,则不进行而外操作,如果是abort()操作,在用第二块内存恢复第一块内存内容。
3:嵌套事务方法类似(2)
目前问题是:性能太低,因为每次进入事务都要复制内存。
如果能实现下面两个问题就好办了
(1)第一个内存数据改变时能得到通知。即监控能存数据改变。
(2)只纪录被改变数据。即增量纪录。

请问各位高手如何才能做到?
...全文
241 9 打赏 收藏 转发到动态 举报
写回复
用AI写文章
9 条回复
切换为时间正序
请发表友善的回复…
发表回复
zx_sanjin 2004-01-13
  • 打赏
  • 举报
回复
push
zengpan_panpan 2004-01-13
  • 打赏
  • 举报
回复
这种情况下,你只能定义一个内存抽象层。内存操作只能通过该抽象层的方法实现,比如memcpy之类的方法必须换成你的相应方法。

其实根本原因在于这是一个应用层的程序,如果你进入核心写驱动程序,解决这种问题是有可能的。比如把你要操作的内存页面设置成只读的,捕捉写操作产生的异常。不过这种异常相当困难,必须模拟产生异常的指令。然而从理解上来说,最符合你的思路。
dfliu 2004-01-13
  • 打赏
  • 举报
回复
to:zengpan_panpan()
上面只是一个简单例子,重载=号不能解决所有问题,比如还是上面情况,换种方式操作:
db = new CMyDatabase("C:\\test.db"); //CMyDatabase是OODB数据库类
long *pl = new (db) long; //在数据库中new一个数值
*pl = 1;
BEGIN_TXN(..) //开始进入事务
//*pl = 2;
//改为
long lTmp = 2;
memcpy(pl, <mp, sizeof(long));
db.abort();
END_TXN(...); //离开事务
这样就无法捕获到了!
日志的纪录是通过捕获数值改变事件,像上面情况捕获不到又如何记录日志。
zengpan_panpan 2004-01-12
  • 打赏
  • 举报
回复
捕获改变只有重载赋值操作了。通过2级指针避免拷贝。

不过这里你犯了一个原则上的错误,需要事务安全的数据库,强调的就是日志,而不是具体的数据。日志就应该及时放到稳定存储上,避免不了IO操作。
hdqqq 2004-01-12
  • 打赏
  • 举报
回复
可以看看 设计模式 那本书,里面有一个memo模式是讲如何支持 撤销等操作的.
dfliu 2004-01-12
  • 打赏
  • 举报
回复
上面说可能不太详细,我再说一下:
我写的数据库程序不是关系型数据库,而是OODB数据库(即按对象存储的数据库),
因此数据的更新如同在使用内存变量一样。
举例如下:
db = new CMyDatabase("C:\\test.db"); //CMyDatabase是OODB数据库类
long *pl = new (db) long; //在数据库中new一个数值
*pl = 1;
BEGIN_TXN(..) //开始进入事务
*pl = 2;
db.abort();
END_TXN(...); //离开事务
问题是如何捕获*pl=2这样操作?而将该操作记录下来呢?
整体复制内存是可以的,但效率很低。有没有其他方法呢?
sailor_Song 2004-01-12
  • 打赏
  • 举报
回复 1
我想你应该对你所处理的数据多作分析才行,从数据中挖掘规律
dfliu 2004-01-12
  • 打赏
  • 举报
回复
友情up
zhangcrony 2004-01-12
  • 打赏
  • 举报
回复
改用數據庫!

16,471

社区成员

发帖
与我相关
我的任务
社区描述
VC/MFC相关问题讨论
社区管理员
  • 基础类社区
  • Web++
  • encoderlee
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告

        VC/MFC社区版块或许是CSDN最“古老”的版块了,记忆之中,与CSDN的年龄几乎差不多。随着时间的推移,MFC技术渐渐的偏离了开发主流,若干年之后的今天,当我们面对着微软的这个经典之笔,内心充满着敬意,那些曾经的记忆,可以说代表着二十年前曾经的辉煌……
        向经典致敬,或许是老一代程序员内心里面难以释怀的感受。互联网大行其道的今天,我们期待着MFC技术能够恢复其曾经的辉煌,或许这个期待会永远成为一种“梦想”,或许一切皆有可能……
        我们希望这个版块可以很好的适配Web时代,期待更好的互联网技术能够使得MFC技术框架得以重现活力,……

试试用AI创作助手写篇文章吧