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

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

有几张表存在外键关系

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

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

如何获得记录的主键值,提供给其他表作为外键的使用呢?
...全文
255 17 打赏 收藏 转发到动态 举报
写回复
用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
  • 打赏
  • 举报
回复
如何保证写入数据的一致性,即要么几张表内全部写入成功,要么全部不写 打开事务,没有问题再提交 如何获得记录的主键值,提供给其他表作为外键的使用呢? 主键什么类型?自增?  一般要取得记录的主键值后,锁此表,使用完再释放
1.项目代码均经过功能验证ok,确保稳定可靠运行。欢迎下载体验!下载完使用问题请私信沟通。 2.主要针对各个计算机相关专业,包括计算机科学、信息安全、数据科学与大数据技术、人工智能、通信、物联网等领域的在校学生、专业教师、企业员工。 3.项目具有丰富的拓展空间,不仅可作为入门进阶,也可直接作为毕设、课程设计、大作业、初期项目立项演示等用途。 4.当然也鼓励大家基于此进行二次开发。在使用过程中,如有问题或建议,请及时沟通。 5.期待你能在项目中找到乐趣和灵感,也欢迎你的分享和反馈! 【资源说明】 C#开发基于FreeSql多库分布式事务、跨库查询、跨库分页查询、跨库增删改等功能实现源码+项目说明+sln.zip **前言** 话说2021年开始了一个基于ASP.NET Core 微服务的项目,谈到微服务 多库环境下 分布式事务、分库分表这些问题都是逃不开的,于是首先从ORM开始调研,需要考虑到一些重要的因素 **功能强大、支持多种数据库(并且行为一致,防止出现换库的情况)、支持分库分表** 等等,这时候第一时间就想到了 [FreeSql](https://github.com/dotnetcore/FreeSql) ,FreeSql的架构设计非常好,每一种支持的数据库都有对应的Provider实现 做到行为一致,而且支持CodeFirst和DbFirst,分库分表FreeSql也有比较简单切有效的方案,本人也经常向FreeSql的作者叶老板请教学习,非常佩服他的技术与人品,也非常感谢他能做出这么好的ORM框架。 **分布式事务** 既然分库了 分布式事务怎么处理,说到分布式事务 常见的解决方案有TCC/SAGA/消息队列最终一致性,在.NET生态中有基于消息队列实现的分布式事务 [CAP](https://github.com/dotnetcore/CAP) ,TCC和SAGA调研了很久没有发现有比较成熟的实现,那么就决定使用`CAP(最终一致性事务)` 由于项目持续的改版,业务的实时性变得越来越高,基于消息队列的这种最终一致性或者说异步事务的方案 越来越不适合我们的项目,这时候就需要同步的事务方案,TCC/SAGE又没有太好的解决方案(我真的没有找到。。),于是想着自己设计一个,基于FreeSql实现事务管理器。 想要的效果:和单库事务一样,出现错误回滚 但是问题来了 多库呢?不同的数据库呢? * 在多库事务的开启时,每个库管理开启自己的事务 * 如果某一个库事务开启后的操作出现异常,则回滚全部数据库事务 * 在多库事务提交时,每个库的事务统一提交 * 记录日志,第一个执行Common的数据库称之为主库,会自动创建一个日志表,用于记录多库事务的信息、执行的SQL、业务模块 用于人工介入或者事务补偿 * 如果主库(第一个库)Common成功后,其他某一个库可能由于网络原因、数据库宕机 无法Common事务,导致数据不一致,这时候要根据日志进行事务补偿或者人工介入,例如 存在三个库(订单库、物流库、商品库) 订单库就是主库(会记录日志) 在Common事务时,如果订单库(主库)Common失败,则(订单库、物流库、商品库)事务全部回滚,如果`订单库`(主库)Common成功,但是`物流库`由于其他原因无法Common成功 则会被日志记录并跳过,然后再去Common `商品库` 以及其他库.. **跨库查询/跨库分页查询** 通过时间分片定位、事件委托、分页算法实现跨库分页查询 1.appsettings.json配置 2.初始化数据库 3.获取IFreeSql操作对象 5.跨库分页查询 6. 跨库增删改 7.跨库并行查询(不分页) 8.跨库ToOne查询 9.跨库Any查询 10.分布式事务、多库事务

7,712

社区成员

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

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