请教:关于数据库多表一致性问题

andy_cai 2013-06-24 08:48:23
Access数据库, odb或者ado方式, vc++

有几张表存在外键关系

如何保证写入数据的一致性,即要么几张表内全部写入成功,要么全部不写。

如果采用Transaction,手工commit的方式的话,

如何获得记录的主键值,提供给其他表作为外键的使用呢?
...全文
270 17 打赏 收藏 转发到动态 举报
AI 作业
写回复
用AI写文章
17 条回复
切换为时间正序
请发表友善的回复…
发表回复
andy_cai 2013-06-27
  • 打赏
  • 举报
回复
引用 16 楼 wwwwb 的回复:
对,自增字段插入失败也要+1 如果不能修改,只有手工了
唉,很希望有个类似hibernet那样的框架啊。。。
wwwwb 2013-06-27
  • 打赏
  • 举报
回复
对,自增字段插入失败也要+1 如果不能修改,只有手工了
andy_cai 2013-06-27
  • 打赏
  • 举报
回复
引用 14 楼 wwwwb 的回复:
假设用LSB保存最大ID db.Insert(表1) UPDATE LSB SET ID=(SELECT MAX(ID) FROM 表1) db.Insert(表2 (ID) SELECT ID FROM LSB); db.EndTransaction();
所以不要用自增字段作为他表的外键值 对吧?呵呵。 非常感谢你的答疑。 但表模型已经这么定了,我是不是只能放弃事务,靠人工来维护数据的一致性了? 就是每条记录都实际提交,后续步骤出现问题,再进行实际删除
wwwwb 2013-06-27
  • 打赏
  • 举报
回复
假设用LSB保存最大ID
db.Insert(表1)
UPDATE LSB SET ID=(SELECT MAX(ID) FROM 表1)
db.Insert(表2 (ID) SELECT ID FROM LSB);
db.EndTransaction();
andy_cai 2013-06-27
  • 打赏
  • 举报
回复
引用 10 楼 wwwwb 的回复:
如果不知的话,用表保存最大的自增字段值, 锁此表(保存最大值)->取最大值->更新此表->释放锁
我希望实现下面的伪代码 db.BeginTransaction(); db.Insert(表1) 这一步需要拿到上面记录的主键值,给下一条语句用 db.Insert(表2 with 表1记录主键) db.EndTransaction();
wwwwb 2013-06-27
  • 打赏
  • 举报
回复
1、建议不使用自增字段 2、更新最新值与插入主、次表在同1个事务中,如成功则提交,否则放弃。
andy_cai 2013-06-27
  • 打赏
  • 举报
回复
引用 10 楼 wwwwb 的回复:
如果不知的话,用表保存最大的自增字段值, 锁此表(保存最大值)->取最大值->更新此表->释放锁
我的期望是利用事务来保证外键关联的两个表的数据要么全写对,要么全不写 自增字段的值是由数据库自身控制的吧? 你说的锁表方式 还是需要提交记录 这样的话,如果另一条记录写失败的话,还要手工删掉 不知道我的问题说的清楚不?对你的方法理解的对不对?
wwwwb 2013-06-27
  • 打赏
  • 举报
回复
如果不知的话,用表保存最大的自增字段值, 锁此表(保存最大值)->取最大值->更新此表->释放锁
andy_cai 2013-06-27
  • 打赏
  • 举报
回复
引用 3 楼 WWWWA 的回复:
主键是自增的, 我原本希望是全部表的数据提交在一个事务中, 不知道这个思路对不对? 是在同一个事务中,如用ADO连接MDB,自增字段可用 select @@identity 取得
我怎么拿到的自增字段值是0啊? 我不用事务后跑了一下,值应该是4
andy_cai 2013-06-27
  • 打赏
  • 举报
回复
引用 7 楼 ACMAIN_CHM 的回复:
用事务就可以了。
表A,B外键关联 在事务中,我写了表A记录,但拿不到这条记录的主键值(自增) 现在我按照 WWWWA 说的方法 拿到的主键值是0。。。
ACMAIN_CHM 2013-06-24
  • 打赏
  • 举报
回复
用事务就可以了。
andy_cai 2013-06-24
  • 打赏
  • 举报
回复
引用 5 楼 WWWWA 的回复:
可以测试一下,在印象中是安全的
感谢! 等有测试结果后,再反馈上来。
WWWWA 2013-06-24
  • 打赏
  • 举报
回复
可以测试一下,在印象中是安全的
andy_cai 2013-06-24
  • 打赏
  • 举报
回复
引用 3 楼 WWWWA 的回复:
主键是自增的, 我原本希望是全部表的数据提交在一个事务中, 不知道这个思路对不对? 是在同一个事务中,如用ADO连接MDB,自增字段可用 select @@identity 取得
再问一下 这种方式,是线程安全的么?
WWWWA 2013-06-24
  • 打赏
  • 举报
回复
主键是自增的, 我原本希望是全部表的数据提交在一个事务中, 不知道这个思路对不对? 是在同一个事务中,如用ADO连接MDB,自增字段可用 select @@identity 取得
andy_cai 2013-06-24
  • 打赏
  • 举报
回复
引用 1 楼 WWWWA 的回复:
如何保证写入数据的一致性,即要么几张表内全部写入成功,要么全部不写 打开事务,没有问题再提交 如何获得记录的主键值,提供给其他表作为外键的使用呢? 主键什么类型?自增?  一般要取得记录的主键值后,锁此表,使用完再释放
主键是自增的, 我原本希望是全部表的数据提交在一个事务中, 不知道这个思路对不对? 抑或您说的锁定表方式,就是另外一种方式? 还请继续答疑。
WWWWA 2013-06-24
  • 打赏
  • 举报
回复
如何保证写入数据的一致性,即要么几张表内全部写入成功,要么全部不写 打开事务,没有问题再提交 如何获得记录的主键值,提供给其他表作为外键的使用呢? 主键什么类型?自增?  一般要取得记录的主键值后,锁此表,使用完再释放

7,732

社区成员

发帖
与我相关
我的任务
社区描述
Microsoft Office Access是由微软发布的关系数据库管理系统。它结合了 MicrosoftJet Database Engine 和 图形用户界面两项特点。
社区管理员
  • Access
加入社区
  • 近7日
  • 近30日
  • 至今
社区公告
暂无公告

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