- java数组入门教程
- java数组的遍历
- 基于debian(ubuntu)的JDK安装与卸载-vps环境搭建实录(一)
- java环境变量配置(windows7系统)
- java开发环境配置
- 第一个java程序 helloword
- 使用eclipse快速开发java程序
- Java基础语法
- Java对象和类
- Java基本数据类型
- Java变量类型
- Java修饰符
- Java运算符
- Java循环结构 – for, while 及 do…while
- Java分支结构 – if…else/switch
- Java Number类
- Java Character类
- Java String类
- Java日期时间
- java异常处理分类
- java Exception异常处理实例
- java.util.UUID 工具类详解
- java数字格式化类DecimalFormat详解
- JDBC系列教程之一:jdbc简单介绍
- JDBC系列教程之二:jdbc连接数据的步骤
- JDBC系列教程之三:JDBC基本的CRUD(创建、读取、更新、删除)
- JDBC系列教程之四:SQL注入PreparedStatement和Statement
- JDBC系列教程之五:数据类型
- JDBC系列教程之六:一个简单用户相关的数据访问层
- JDBC系列教程之七:用配置文件(properties)和反射实现与具体类的耦合
- JDBC系列教程之八:事务-ACID
- JDBC系列教程之九:事务-SavePoint与JTA
- JDBC系列教程之十:隔离级别
- JDBC系列教程之十一:其他的几个API
- JDBC系列教程之十二:DatabaseMetaData(数据库的元数据信息)和ParameterMetaData(参数的元数据信息)
- JDBC系列教程之十三:ResultSetMetaData
- JDBC系列教程之十四:用反射ResultSetMetaData将查询结果读入对象中
- JDBC系列教程之十五:数据源和连接池
- Java 继承
- Java 重写(Override)与重载(Overload)
- Java 多态
- Java 抽象类
- java 封装
- Java 接口
- Java 包(package)
- Java 数据结构
- Java 集合框架
- Java 泛型
- Java序列化
- Java 网络编程
- Java 发送邮件
- Java 多线程编程
- Java Applet基础
- Java 文档注释
知识点
相关文章
更多最近更新
更多JDBC系列教程之九:事务-SavePoint与JTA
2019-02-28 23:24|来源: 领悟书生
事务-SavePoint
l 当只想撤销事务中的部分操作时可使用SavePoint
l SavePoint sp = connection.setSavepoint();
l connection.rollerbak(sp);connection.commit();
SavePointTest.java |
package com.hyneng.jdbc;
import java.sql.Connection; import java.sql.ResultSet; import java.sql.SQLException; import java.sql.Savepoint; import java.sql.Statement;
/** * 2010-10-07 * @author HuangYineng */ public class SavePointTest { public static void main(String[] args) throws SQLException { test(); }
static void test() throws SQLException { Connection conn = null; Statement st = null; ResultSet rs = null; Savepoint sp = null; try { conn = JdbcUtils.getConnection(); conn.setAutoCommit(false); st = conn.createStatement(); String sql = "update user set money=money-10 where id=1"; st.executeUpdate(sql); //保存点 sp = conn.setSavepoint();
sql = "update user set money=money-10 where id=3"; st.executeUpdate(sql);
sql = "select money from user where id=2"; rs = st.executeQuery(sql); float money = 0.0f; if (rs.next()) { money = rs.getFloat("money"); } if (money > 300) throw new RuntimeException("已经超过最大值!");
sql = "update user set money=money+10 where id=2"; st.executeUpdate(sql);
conn.commit(); } catch (RuntimeException e) { if (conn != null && sp != null) { conn.rollback(sp); conn.commit(); } throw e; } catch (SQLException e) { if (conn != null) conn.rollback(); throw e; } finally { JdbcUtils.free(rs, st, conn); } } } |
事务-JTA(暂不实现)
l 跨越多个数据源的事务,使用JTA容器实现事务。
l 分成两阶段提交。
l javax.transaction.UserTransaction tx =(UserTransaction)ctx.lookup(“jndiName");
tx.begin();
//connection1connection2 (可能来自不同的数据库)…
tx.commit();//tx.rollback();
本文链接:JDBC系列教程之九:事务-SavePoint与JTA,转自请注明:http://www.656463.com/article/803
相关问答
更多-
spring的jdbc事务管理和JTA有什么区别?[2022-04-20]
hibernate的事务管理方式仅仅就是托管给JDBC(如果用JTA那么就是JTA) 而JDBC的一切行为包括事务是基于一个connection的,那么hibernate委托给JDBC的事务也就是基于一个session。JTA与JDBC事务不同在于可以跨连接。spring也是调用hibernate中事务管理的API, hibernate的事务管理,一般是编程性的, 而委托给spring之后,可以使用声明式的,也就是可以在XML之中配置哪些需要进行事务管理,哪些不需要. -
Java JDBC savePoint(Java JDBC savePoint)[2021-08-07]
保存点表示当前事务可以回滚到的点。 它可以选择仅回滚其中的一部分,而不是将其所有更改回滚。 例如,假设你: 开始交易, 在表格中插入10行, 设置一个保存点, 再插入5行, 回滚到保存点, 提交交易。 完成后,表格将包含您插入的前10行。 其他5行将被回滚删除。 设置保存点不会'保存'任何数据到数据库。 它不会使数据库更改对任何其他事务可见。 保存点只是当前事务可以回滚到的标记。 A savepoint marks a point that the current transaction can roll ... -
(正如@Piotr Nowicki所指出的,JTA 确实允许嵌套事务,但这是可选的,不是强制性的。) 为什么? 这是其中一个问题,无法肯定地回答,除非你是做出决定时“在房间里”的人之一。 这可能是将嵌套事务作为规范的一部分而固有的复杂性。 或当时的复杂性; 即他们不知道他们知道如何做好指定他们的工作。 可能是因为他们认为没有足够的需求。 这可能是时间压力......或者只是简单的疲惫。 这可能是“商业原因”; 例如某些供应商不希望通过扩大规范的范围来干扰产品发布时间表。 但是,底线是,如果你想要真正的答案, ...
-
因为saveToEM是在本地调用的,所以它被视为一个java方法,因此容器不会启动该调用的事务。 Because saveToEM is being called locally, it is treated as just a java method, so the container will not start a transaction for the call.
-
我来自Atomikos。 我们提供此功能,但不是我们的开源/免费版(而是付费版)的一部分。 但是我们的价格相当实惠(请查看我们的网站了解详情)。 希望这可以帮助, 家伙 I am from Atomikos. We offer this capability but alas not as part of our open source / free edition (rather, the paid edition). However our prices are pretty affordable (p ...
-
回滚JTA事务(rollback on JTA Transactions)[2024-01-13]
使用Container托管事务时 ,默认情况下会在事务中运行所有会话Bean。 这意味着,如果发生导致事务回滚的某些异常,则还会回滚对demo的更改。 以下是有关flush()如何工作的一些有用信息: https : //en.wikibooks.org/wiki/Java_Persistence/Persisting#Flush When using Container managed transactions all session beans are by default run within tra ... -
混合JTA和JDBC事务(Mixing JTA and JDBC transactions)[2024-02-08]
我实际上用一种稍微不同的方法解决了我的问题。 我没有“混合”JTA和JDBC事务,而是使用suspend和resume来处理不同的用户事务。 任务仍然是相同的:我启动一个(JTA)用户事务,其中包含一些JMS和JDBC事务(接收消息,执行一些数据库操作)。 在该工作流程的中间,我想编写一个消息日志,但是当“外部”事务失败时,不会回滚日志记录。 所以解决方案是伪代码: transactionManager.begin() doSomeJdbcStuff(); Transaction main = tra ... -
虽然JTA规范没有强制在每个语句之后释放连接,但是Hibernate这样做是因为旧应用程序服务器中的一些奇怪行为导致引入AFTER_STATEMENT连接释放模式 ,其行为如下: 连接在每个语句执行后释放,并在运行下一个语句之前重新获取。 虽然JDBC或JTA规范不要求,但此策略旨在防止应用程序服务器错误地检测连续EJB(Enterprise Java Bean)调用之间的连接泄漏 因此,它发生的原因是您使用JTA环境,而不是RESOURCE_LOCAL环境。 您可以通过设置以下Hibernate属性来覆盖 ...
-
你有没有为transactionManagerName试过java:comp/env/TransactionManager ? ,您还声明了如下所述的TransactionManager和DataSource: http : //tomee.apache.org/containers-and-resources.html ? Have you tried java:comp/env/TransactionManager for the transactionManagerName? , Also have ...
-
JTA感知JDBC连接池(JTA aware JDBC connection pools)[2022-02-23]
一些独立的事务管理器(如Atomikos或Bitronix)拥有自己的集成连接池。 这样的池符合JTA,可以解决您的问题。 最近我遇到了同样的问题,最后我最终得到了Bitronix及其集成连接池。 它运作良好。 Some standalone transaction managers like Atomikos or Bitronix have their own integrated connection pool. Such a pool is JTA compliant and would solve ...