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条)

报告相同问题?

悬赏问题

  • ¥15 网络科学导论,网络控制
  • ¥100 安卓tv程序连接SQLSERVER2008问题
  • ¥15 利用Sentinel-2和Landsat8做一个水库的长时序NDVI的对比,为什么Snetinel-2计算的结果最小值特别小,而Lansat8就很平均
  • ¥15 metadata提取的PDF元数据,如何转换为一个Excel
  • ¥15 关于arduino编程toCharArray()函数的使用
  • ¥100 vc++混合CEF采用CLR方式编译报错
  • ¥15 coze 的插件输入飞书多维表格 app_token 后一直显示错误,如何解决?
  • ¥15 vite+vue3+plyr播放本地public文件夹下视频无法加载
  • ¥15 c#逐行读取txt文本,但是每一行里面数据之间空格数量不同
  • ¥50 如何openEuler 22.03上安装配置drbd