【问题标题】:How to handle transactions without any framework in java (JDBC)?java(JDBC)中如何在没有任何框架的情况下处理事务?
【发布时间】:2015-06-16 18:08:26
【问题描述】:

我对java很陌生。我正在使用简单的 JSP/Servlet 和 Service/Dao 架构来学习 JDBC。请考虑下面给出的代码快照。

package com.login.servlet;

import java.io.IOException;

import javax.servlet.ServletException;
import javax.servlet.http.HttpServlet;
import javax.servlet.http.HttpServletRequest;
import javax.servlet.http.HttpServletResponse;

public class HelloServlet extends HttpServlet {

    @Override
    protected void doPost(HttpServletRequest request,
            HttpServletResponse response) throws ServletException, IOException {
        HelloService helloService = new HelloService();
        helloService.doMyUnitOfWork();
    }

}

class HelloService {
    public void doMyUnitOfWork() {
        HelloDao helloDao = new HelloDao();
        // I want to execute all below three works in single unit, it means I want to use single transaction for all database operations.
        // Thus any of my below database operation fails I want to rollback all of them, otherwise commit all in database.
        helloDao.doMyWork1();
        helloDao.doMyWork2();
        helloDao.doMyWork3();
    }
}

class HelloDao {
    public void doMyWork1() {
        // this will do database operation 1.
    }

    public void doMyWork2() {
        // this will do database operation 2.
    }

    public void doMyWork3() {
        // this will do database operation 3.
    }
}

正如我在上面的代码快照中提到的,我需要使用简单的 JDBC 在服务层处理事务。当我尝试谷歌它时,我得到的几乎是 Spring 和 EJB 结果,而不是简单的 JDBC。

有可能吗?如果是,那么如何?

提前致谢。

【问题讨论】:

  • Mkyong 的教程也不错,只要检查一下是否过时:mkyong.com/jdbc/jdbc-transaction-example
  • 感谢您的宝贵时间,但我已经浏览了您提供的两个链接。似乎他们已将一笔交易用于相同的方法。就我而言,我需要它用于不同的方法和不同的类。
  • 在这种情况下,查看 Java Transaction API (JTA) 可能会有所帮助,因为它是一个更高级的要求。你也可以通过在类、方法和提交之间共享 JDBC 连接来滚动你自己的实现,但它很快就会变成像 JTA 这样的东西的低级实现。

标签: java jdbc service transactions


【解决方案1】:

是的,这是可能的。 Hibernate 等框架在内部使用 jdbc。

您可以使用

开始交易
connection.setAutoCommit(false);

您可以回滚您的事务:

connection.rollback();

如果您想将数据保存在您调用的数据库中:

connection.commit();

您的交易可以通过以下方式关闭:

connection.close();

这是一个例子:

Connection connection = ...
try{
connection.setAutoCommit(false);


Statement statement1 = null;
try{
    statement1 = connection.createStatement();
    statement1.executeUpdate(
        "update people set name='John' where id=123");
} finally {
    if(statement1 != null) {
        statement1.close();
    }
}


Statement statement2 = null;
try{
    statement2 = connection.createStatement();
    statement2.executeUpdate(
        "update people set name='Gary' where id=456");
} finally {
    if(statement2 != null) {
        statement2.close();
    }
}

connection.commit();


} catch(Exception e) {
connection.rollback();
}finally {
if(connection != null) {
    connection.close();
}
}

http://tutorials.jenkov.com/jdbc/transaction.html复制,以防被删除。

【讨论】:

  • 感谢您的宝贵时间,但这不是我想要的。回答前请仔细看问题。
猜你喜欢
  • 2016-04-02
  • 2012-09-21
  • 1970-01-01
  • 2020-04-05
  • 1970-01-01
  • 1970-01-01
  • 2019-10-26
  • 2019-07-28
  • 2012-09-13
相关资源
最近更新 更多