JAVA概述
第一部分:java入门基础
第二部分:java常用类
第三部分:jdbc系列教程
第四部分:java高级特征
java8新特征详解
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

相关问答

更多
  • hibernate的事务管理方式仅仅就是托管给JDBC(如果用JTA那么就是JTA) 而JDBC的一切行为包括事务是基于一个connection的,那么hibernate委托给JDBC的事务也就是基于一个session。JTA与JDBC事务不同在于可以跨连接。spring也是调用hibernate中事务管理的API, hibernate的事务管理,一般是编程性的, 而委托给spring之后,可以使用声明式的,也就是可以在XML之中配置哪些需要进行事务管理,哪些不需要.
  • 保存点表示当前事务可以回滚到的点。 它可以选择仅回滚其中的一部分,而不是将其所有更改回滚。 例如,假设你: 开始交易, 在表格中插入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 ...
  • 使用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事务,而是使用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 ...
  • 一些独立的事务管理器(如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 ...