首页
学习
活动
专区
圈层
工具
发布
首页
学习
活动
专区
圈层
工具
社区首页 >问答首页 >使用JDBC 3.0实现对嵌套事务的支持

使用JDBC 3.0实现对嵌套事务的支持
EN

Stack Overflow用户
提问于 2009-02-06 10:57:19
回答 3查看 5.7K关注 0票数 2

我们的遗留应用程序使用JDBC 3.0。它通过实现自己的事务管理器来支持事务,该管理器能够为每个线程返回相同的JDBC连接。我最近发现的问题是它不支持嵌套事务:如果一个事务在另一个事务中启动,那么在内部事务上下文中运行的每个SQLs都将使用相同的db连接来执行,并且当它被提交或回滚时,它将自动提交或回滚从外部事务开始的所有更改。

据我所知,我可以使用JDBC 3.0保存点实现对嵌套事务的支持:每当启动嵌套事务时,我都可以为当前连接设置一个新的保存点。之后,如果回滚嵌套的事务,我将只回滚到这个保存点。另一方面,如果它被提交,我将什么也不做。只有最外层事务的提交才会保存对db的更改。

这是正确的吗?这种方法有什么缺陷吗?如果是,我的可能性是什么?

谢谢。

EN

回答 3

Stack Overflow用户

发布于 2009-02-06 12:51:52

代码中可能存在期望提交完成而不是延迟的依赖项(例如,如果隔离级别设置为TRANSACTION_READ_COMMITTED)。

考虑将事务管理器修复为在单独的连接上执行嵌套事务。

更新:看起来the Spring framework使用SavePoints来提供嵌套事务。我的猜测是他们只是忽略了隔离模式的问题。

票数 2
EN

Stack Overflow用户

发布于 2009-02-06 11:12:36

事务有点棘手,不能真正从JDBC层查看,而是从底层数据库本身查看。我将从现在开始谈论Oracle,因为它是我最有经验的东西。在Oracle中,如果启动一个事务,则可以回滚到事务中的保存点,但不能使用保存点进行提交。因此,假设我启动了一个事务,并且有三个保存点: A、B和C。我可以顺利地前进并回滚到A、B或C,但是一旦提交,您就已经启动了一个新事务,现在A、B和C不再有效。我希望这将有助于回答你的问题。

票数 1
EN

Stack Overflow用户

发布于 2009-06-02 12:44:27

您可以尝试Atomikos TransactionsEssentials中的嵌套事务支持。

但是,DBMS中的嵌套事务通常受到以下限制:

-either您的嵌套事务共享相同的DB事务,这允许以回滚粒度为代价进行共享数据访问(您回滚整个事务)

-or您的嵌套事务被映射(由Atomikos)到不同的底层DB事务,代价是不允许对热点数据进行共享数据访问

这种不匹配是由于数据库事务的ACID性质造成的。最终,您所有的DBMS访问都必然发生在这样的数据库事务中。

如果您想自己包装一些东西,您提到的保存点方法听起来很有希望-但是您可能需要确保对其进行广泛的测试。

最佳男主角

票数 1
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/521669

复制
相关文章
SQL数据库-新增字段时,给默认值的方法
alter table 表名 ADD 字段 int NOT NULL DEFAULT 0
Lic工作室
2021/04/29
1.9K0
SQL数据库-新增字段时,给默认值的方法
关于conda 更新时权限的问题
就被告知以下错误:PermissionError(13,'Permission denied)
戈贝尔光和热
2018/12/27
2.1K0
hibernate 插入数据时让数据库默认值生效
用hibernate做数据库插入操作时,在数据库端已经设置了对应列的默认值,但插入的数据一直为null。查找资料发现,原来是hibernate的配置项在作怪。 Hibernate允许我们在映射文件里控制insert和update语句的内容.比如在映射文件中<property 元素中的update属性设置成为false,那么这个字段,将不被包括在基本的update语句中,修改的时候,将不包括这个字段了.insert同理.dynamic动态SQL语句的配置也是很常用的.下面介绍配置SQL语句的具体属性: 1)
小柒2012
2018/04/13
1.5K0
更新时 Fiber 节点能否复用?
当产生更新时,workInProgressTree 的 Fiber 节点有两种方式生成:
玖柒的小窝
2021/12/07
5280
Linq to Sql 更新数据时容易忽略的问题
越来越多的朋友喜欢用Linq to Sql来进行开发项目了,一般我们都会遇到CRUD等操作,不可否认,在查询方面Linq真的带来很大的便利,性能方面也表现不错,在插入操作和删除操作中,Linq的表现也还不错,但是在更新某条记录的时候,性能就相对比较弱了,我们一般会使用ExecuteSql等方法来执行脚本。 不过有时候,我们还是会使用Linq to Sql来进行Update,执行的步骤:获取一个记录-〉更新字段 -〉submitChanges() 昨天遇到了一个问题,流程都没有错,但是更新的时候始终没有更新到
脑洞的蜂蜜
2018/02/01
1.3K0
成员变量的默认值
int类型的默认值是0 String类型的默认值是null double类型的默认值是0.0d Integer类型的默认值是null Long类型的默认值是null long类型的默认值是0L float类型的默认值是0.0f char类型的默认值是\u0000 byte类型的默认值是(byte)0 short类型的默认值是(short)0
gfu
2019/09/18
2.6K0
TortoiseSVN 从 GitHub 更新时发生异常
使用 TortoiseSVN 从 GitHub 仓库 Update 时,弹出错误提示对话框:
mzlogin
2020/04/16
1.3K0
TortoiseSVN 从 GitHub 更新时发生异常
使用 TortoiseSVN 从 GitHub 仓库 Update 时,弹出错误提示对话框:
零式的天空
2022/03/28
1.2K0
MySQL 5.7建表时date类型提示默认值类型错误的问题处理
报的错误是时间的默认值有错误,查阅后发现原来是 MySQL 5.7 版本开始有了一个 STRICT MODE(严格模式),此模式中对默认值做了一些限制。
用户7657330
2021/01/07
3.3K0
使用dbms_stat采集统计信息时estimate_percent和cascade的默认值
收集统计信息可以用dbms_stats包,通常用这样的语法:exec dbms_stat.gather_table_stats(ownname=>'xxx', tabname=>'xxx', estimate_percent=>xxx, method_opt=>'xxx', cascade=>xxx);
bisal
2019/01/29
2.8K0
当我学python时遇见的问题汇总(持续更新)
PS:一开始我在cmd里面安装过pygame的,但是我用IDLE运行时还是出错,于是只能自己去网上下载来安装
天天Lotay
2022/12/01
5510
当我学python时遇见的问题汇总(持续更新)
解决多个版本的python共存时的问题 => 持续更新
WINDOWS Q1: 从命令行启动只能通过python 无法区别不同版本的python(比如2.7和3.4),实际上只能启动某一个特定版本 A1: 可以分别将不同版本的python安装根目录下的py
拓荒者
2019/03/16
9070
Spring Data默认值的错误
Spring Data有很多配置的默认值,但不一定都适合你。如一个依赖Cassandra 的项目,有时写入数据后,并不能立马读到。这种错误并没有什么报错,一切都是正常的,就是读不到数据。
JavaEdge
2023/01/15
1.1K0
SQL Server2000导出数据时包含主键、字段默认值、描述等信息
时经常用SQL Server2000自带的导出数据向导将数据从一台数据库服务器导出到另一台数据库服务器: 结果数据导出了,但表的主键、字段默认值、描述等信息却未能导出,一直没想出什么方法
阿炬
2018/05/11
1.2K0
Laravel Validator 更新时验证记录唯一的小技巧
这样在新增的时候是没什么问题的,但是在更新的时候就出现了一个问题,就是当我们的title没有发生改变的时候,我们使用unique的时候,会将原来的记录行进行扫描,这样就会提示我们该标题已经存在。
魔王卷子
2019/05/30
1.6K0
更新数据时,MySQL的聚簇索引是如何变化的?
搜索一个主键id对应的行,先去顶层的索引页88里通过二分查找,定位到你应该去下层哪个索引页里继续找。
JavaEdge
2022/02/20
1.7K0
更新数据时,MySQL的聚簇索引是如何变化的?
CentOS 使用 yum update 更新时保留特定版本的软件
有时需要保留特定版本的软件不升级,但升级其他软件,这时就需求用到下面的技巧。当CentOS/RHEL/Fedora下的Linux服务器使用 yum update 时命令如何排除选定的包呢?
用户1685462
2021/08/31
1.5K0
函数默认值
面试中可能会问到下面问题 function say(a = 1) { console.log(a); } say(null); say(undefined); say(); say(0); console.log(say.length); // say.length表示函数形参个数 关于答案,我先卖个关子,相信你看了下面的解析就会被安排的明明白白。 基本用法 1个参数有默认值 // ES6代码 function say(a = 1) { console.log(a); } // 转为ES5代码 f
grain先森
2019/08/23
1.5K0
点击加载更多

相似问题

更新时Kartik Depdrop Widget的默认值?

20

嵌套默认值-更新值时出错

12

MySQL:更新时设置为默认值

20

防止在更新时使用默认值

11

重复键更新时的MySQL默认值错误

26
添加站长 进交流群

领取专属 10元无门槛券

AI混元助手 在线答疑

扫码加入开发者社群
关注 腾讯云开发者公众号

洞察 腾讯核心技术

剖析业界实践案例

扫码关注腾讯云开发者公众号
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档
查看详情【社区公告】 技术创作特训营有奖征文