`

jdbc一个connection 下的事务问题[转]

    博客分类:
  • Java
 
阅读更多

在不分层的情况下,一个JDBC事务处理代码片断如下:

try {
    conn =DriverManager.getConnection("url","username","userpwd";
    conn.setAutoCommit(false);//禁止自动提交,设置回滚点
    stmt = conn.createStatement();
    stmt.executeUpdate("alter table …"); //数据库更新操作1
    stmt.executeUpdate("insert into table …"); //数据库更新操作2
    conn.commit(); //事务提交
}catch(Exception ex) {  
  ex.printStackTrace();
  try {
      conn.rollback(); //操作不成功则回滚
  }catch(Exception e) {
        e.printStackTrace();
    }
}

对目前的开发来说,基本都会采用分层的架构,如:表现action层、业务逻辑service层、数据访问dao层;
spring对事务做了很好的封装;但是在很多的需求和应用,jdbc还是有其优势的。所以,这里只讨论纯jdbc下分层架构的事务控制。

当采用分层架构的时候,jdbc事务的问题出在:
一 分层架构中,事务控制应该放在哪一层,我的意见: 
事务是以业务逻辑为基础的;一个完整的业务应该对应服务层里的一个方法;如果业务操作失败,则整个事务回滚;所以,事务控制是绝对应该放在service层的;
二 如果不同意第一条,认为事务控制可以放在DAO层中,请看下面的例子:
有一个班级业务逻辑类classService,对班级的删除操作,级联到另一张表班级学生关系表的记录删除。
想要将这两个操作放在一个事务中,你可以会这样设计ClassDAO:

public class ClassDAO {
        private Connection conn = DBManager.getConnection;
        public void delClassAndClassStuReal(String classId) {
            try {
                conn.setAutoCommit(false);
                //班级的删除
                //班级学生关系记录的删除
                conn.commit(); //事务提交
            } catch(SQLException e) {
                 try {
                         conn.rollback();
                 }
            }
            
        }
    }

但是,DAO层的设计应该遵循一个很重要的原则:DAO层应该保证操作的原子性,就是说DAO里的每个方法都应该是不可以分割的。基于DAO层设计的细粒度原则,classDAO中应该是有这样两个方法:

public class ClassDAO {
        public void delClass(String classId) {
            //班级的删除
        }
        public void delClassStuReals(String classId) {
            //班级学生关系记录的删除
        }
    }
那事务的问题就来了:怎样保证这两个删除操作的执行在同一个事务中?
三 如果你原则上同意第一条:
jdbc中事务控制是基于Connection的;虽说事务控制应该放在service层,但是Connection是不应该在service层中被实例出来的。一个有悖解耦的jdbc分层事务控制想法是:
在service层中实例Connection并控制事务;调用dao的时候将这个Connection传给dao层。
这样做,存在明显的耦合:dao层依赖了service层;我们做分层应该是上层依赖下层的,下层依赖上层是不应该出现的。

 

分享到:
评论
2 楼 atpx309391907 2013-03-05  
哥们,顶一个;我现在也头疼这个问题。
我就是用了你说的dao依赖service 层的connection的设计。 
而且这种方案,不能用把事务控制以aop形式实现。因为如果在handler的invoke方法中先connection.setAutoCommit(false);OK,那么接下来的method.invoke()中的参数,就不是同一个connection了。蛋疼啊
1 楼 495081611 2012-12-20  
一个有悖解耦的jdbc分层事务控制想法是:
在service层中实例Connection并控制事务;调用dao的时候将这个Connection传给dao层。
这样做,存在明显的耦合:dao层依赖了service层;我们做分层应该是上层依赖下层的,下层依赖上层是不应该出现的。



兄弟 上面这个问题怎么解决啊,一直在想有没有方法可以绕过去。最近写个东西,用jdbc的分层架构,后来想加事务控制,

相关推荐

    jdbc-mysql-connection

    JDBC是Java平台上的一个标准接口,它允许Java应用程序与各种类型的数据库进行通信,包括MySQL。MySQL是一种广泛使用的开源关系型数据库管理系统(RDBMS),在Web应用程序开发中尤其常见。 描述中提到的是从官方网站...

    JDBC的事务初探

    通过对这些文件的分析,我们可以推测这是一个使用JDBC进行数据库操作的Java项目,其中可能涉及到事务的管理。具体实现细节需要查看源代码才能得知。 总结,JDBC事务是Java与数据库交互时的关键部分,通过理解事务的...

    JDBC事务管理的简单实现

    在JDBC编程中,事务管理是非常重要的一部分。为了实现数据一致性,需要在代码中显示的调用Connection方法的事务相关API来完成工作。下面是关于JDBC事务管理的简单实现的知识点。 一、事务管理的必要性 在数据库...

    spring分别与jdbc和hibernate结合的事务控制--案例

    当一个数据库操作跨越多个DAO(数据访问对象)调用时,Spring会确保这些操作在一个事务内完成。这意味着,如果任何一步出错,整个事务都将被回滚,保持数据的一致性。 在实践中,开发者需要考虑事务隔离级别,这是...

    JDBC事务管理.docx

    2. 脏读:一个事务读取了另一个未提交的事务修改的数据,可能导致读取到不准确的信息。 3. 不一致的分析(非重复读):一个事务在不同时间读取同一数据,由于其他事务的提交,每次读取的结果不同。 4. 幻读:事务在...

    JDBC事务操作例子所需jar包

    在事务中,所有的SQL操作应在一个Connection对象的上下文中执行,以确保它们作为一个整体被处理。 3. **Transaction隔离级别**:事务有四种隔离级别,包括读未提交(READ UNCOMMITTED)、读已提交(READ COMMITTED...

    JDBC事务处理机制探秘

    在JDBC中,默认情况下,每个单独的SQL语句都是在一个自动提交(auto-commit)的事务中执行的,这意味着每执行完一个SQL语句,数据库就会立即提交事务。如果想要将多个SQL语句作为一个整体来处理,即在同一个事务中...

    JavaBean中使用JDBC方式进行事务处理

    事务是指一系列的操作作为一个完整的执行单元,在这些操作中,如果有一个失败,则整个事务都失败。事务处理的主要目的是为了保证数据的一致性和完整性。事务具有以下四个特性: 1. **原子性(Atomicity)**:事务中...

    jdbc三层中使用事务

    本案例使用纯JDBC+三层架构,演示在业务逻辑层中使用事务的方式. ...又如何保证每个dao方法的Connection对象统一且不被关闭?如何确保在多线程环境下的安全性?如果你有以上的疑问,希望本案例能帮你解决这些问题!

    JDBC事务管理项目

    以下是一个简单的JDBC事务管理示例: ```java try (Connection conn = DriverManager.getConnection(DB_URL, USER, PASS)) { conn.setAutoCommit(false); // 关闭自动提交 try (Statement stmt1 = conn....

    jdbc连接数据库事务工厂模式

    在"jdbc连接数据库事务工厂模式"中,我们主要关注三个方面:JDBC、事务管理和工厂模式。 首先,JDBC提供了与数据库交互的基本步骤,包括加载驱动、建立连接、执行SQL语句和关闭连接。例如,使用`Class.forName()`...

    JDBC事务控制--讲述如何控制JDBC事务

    默认情况下,JDBC 连接处于自动提交模式,这意味着每次执行 SQL 语句后都会自动提交事务。为了控制事务,我们需要关闭自动提交模式,然后手动提交或回滚事务。 1. **关闭自动提交** 使用 `setAutoCommit(false)` ...

    jdbc入门、分页以及事务

    3. **游标分页**: 如果不支持LIMIT或ROWNUM,可以通过保存上次查询的最后一个记录的ID,然后在下次查询时作为条件,以实现分页。 **JDBC事务** 事务是数据库操作的基本单元,确保数据的一致性和完整性。JDBC提供了...

    java事务 - 传递Connection

    3. **开始事务**:虽然在禁用自动提交后,下一个数据库操作会自动开始一个新的事务,但也可以显式调用`Connection.beginTransaction()`来明确表示事务开始。 4. **执行SQL操作**:在同一个`Connection`上执行一系列...

    Java jdbc三层及事务(转账案例)

    在Java JDBC中,我们可以使用Connection对象的setAutoCommit(false)方法来关闭自动提交,然后手动控制事务的开始(startTransaction)、提交(commit)和回滚(rollback)。例如,在转账操作中,如果两个账户的扣款...

    jdbc连接各数据库及事务处理

    1. 设置自动提交为false:默认情况下,JDBC的每个数据库操作都是一个事务,且默认开启自动提交。要手动控制事务,需要先关闭自动提交:`conn.setAutoCommit(false);` 2. 开始事务:手动开启事务,通常是在关闭自动...

    sql.rar_MySQLConnection_sqljdbc4-3.0.jar

    标题中的"sql.rar_MySQLConnection_sqljdbc4-3.0.jar"暗示了这是一个与SQL数据库连接相关的资源包,特别是涉及到MySQL和SQL Server的连接。其中,“MySQLConnection”指的是Java程序连接MySQL数据库的方式,而“sql...

    JDBC设置事务自动提交

    在默认情况下,JDBC连接处于自动提交模式,这意味着每当执行一个SQL语句时,如果成功,它就会被提交;如果出现错误,就会回滚。 要设置JDBC的自动提交模式,我们需要调用`Connection`对象的`setAutoCommit`方法。...

    JdbcConnection

    10. **事务管理**:JdbcConnection项目可能涉及事务操作,比如多个数据库操作作为一个原子单元。通过`Connection`对象的`setAutoCommit(false)`关闭自动提交,然后在所有操作成功后调用`commit()`,或者在发生错误时...

Global site tag (gtag.js) - Google Analytics