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 我这模型写的不对吗?为什么lingo解出来的下面影子价格这一溜少一个变量
  • ¥50 树莓派安卓APK系统签名
  • ¥15 maple软件,用solve求反函数出现rootof,怎么办?
  • ¥65 汇编语言除法溢出问题
  • ¥15 Visual Studio问题
  • ¥20 求一个html代码,有偿
  • ¥100 关于使用MATLAB中copularnd函数的问题
  • ¥20 在虚拟机的pycharm上
  • ¥15 jupyterthemes 设置完毕后没有效果
  • ¥15 matlab图像高斯低通滤波