zjian0573 2009-03-12 10:36
浏览 294
已采纳

关于jdbc多表操作事务的一些疑问,怎么去控制事务

现在回归原始做jdbc的程序。主要功能是实现一个sql脚本管理功能(版本控制)一共3张表
表一: sripit_info  (主要存脚本的描述性信息,和最新的版本号和内容ID)
主要字段说明: id(主键),creator,createTime,version(最新版本号),content_id(最新版本对应的内容id)
表二:script_content(维护版本和脚本内容)
主要字段:id(主键),script_id(外键,表示属于哪个脚本),version(版本号),content(sql代码内容,是个 blob大字段)
表三:script_sqls (把不同版本的脚本内容拆分成单条sql放在这张表中)
主要字段:id(主键),text(一条sql文),content_id(外键,表示这条sql所对应的版本的内容id)
另外就是建个seq_script(orcale 的 sequence)

我想的设计流程是(假设是一个新增操作):
1、取得一个sequence,并另保存为sripit_id
2、插入 sripit_info 表
3、取得一个sequence,并另保存为content_id
4、插入 script_content 表,其中的外键可以用之前的sripit_id得到
5、批处理插入 script_sqls 表(把脚本的sql文拆分为单条sql语句,外键可以从content_id得到)
6、更新版本,把 content_id 和version信息 更新到sripit_info 表
7、完成

我现在的问题是,以上的每一步都是一个事务,但是业务上后面的事务都要依赖与之前的事务完成才能进行。
我不知道jdbc怎么去控制业务上的事务, 我已经设置了connection的autocommit为false.然后以上涉及insert的操作都是成功commit,失败rollback的。但是如何把整个业务设计成一个事务,就是以上7步只要有一步不成功,全部都rollback ,怎么做?
例如 我步骤2(插入 sripit_info 表)成功了,数据库确实是commit进去了,能查到了。但是后面的步骤4(插入 script_content 表)出错了,被rollback,没有提交到数据库,但我希望此时之前的操作也能都rollback。要怎么设计呢?

刚刚换单位,居然这边都不用spring和hibernate。全部是jdbc,小弟对jdbc的事务不是很清楚,请大家帮我解惑,谢谢


问题补充
我暂时吧所以业务写在一个事务里面了

  • 写回答

5条回答 默认 最新

  • sunweiherber 2009-03-12 13:17
    关注

    在你的DAO层再加一层(比如BO层),在BO层声明Transaction,取得一个connection.
    在DAO层把connection作为参数.
    在BO层调用DAO层的方法,把connection传进去.
    事务的提交在BO层完成.

    本回答被题主选为最佳回答 , 对您是否有帮助呢?
    评论
查看更多回答(4条)

报告相同问题?

悬赏问题

  • ¥40 复杂的限制性的商函数处理
  • ¥15 程序不包含适用于入口点的静态Main方法
  • ¥15 素材场景中光线烘焙后灯光失效
  • ¥15 请教一下各位,为什么我这个没有实现模拟点击
  • ¥15 执行 virtuoso 命令后,界面没有,cadence 启动不起来
  • ¥50 comfyui下连接animatediff节点生成视频质量非常差的原因
  • ¥20 有关区间dp的问题求解
  • ¥15 多电路系统共用电源的串扰问题
  • ¥15 slam rangenet++配置
  • ¥15 有没有研究水声通信方面的帮我改俩matlab代码