一,最近项目中,spring事物的管理,引发好奇,就是在事物回滚之前,对数据的插入更新操作,只要
未提交,都不更改数据库,但是在查询时得到的结果却是插入更新之后的,带着疑问我做一下的例子.
二,JDBCHelper类
package com.ming.test.two;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
public class JDBCHelper {
public static ThreadLocal<Connection> local = new ThreadLocal<Connection>();
//启动时 加载驱动
static{
try {
Class.forName("com.mysql.jdbc.Driver");
} catch (ClassNotFoundException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("mysql驱动不存在!");
}
}
public static Connection getConnection(){
Connection connection = local.get();//在当前线程找
try {
if(connection==null){
connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/test?zeroDateTimeBehavior=convertToNull", "root","root");
local.set(connection);
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
System.out.println("connection获取失败!");
}
return connection;
}
public static void closeConnection(Connection connection ){
try {
if(connection!=null){
connection.close();
local.remove();
}
} catch (SQLException e) {
// TODO Auto-generated catch block
e.printStackTrace();
}
}
}
test类
package com.ming.test.two;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class Test {
public static String id="12";
public static void main(String[] args) {
Connection con = JDBCHelper.getConnection();
try {
// con.createStatement();
// con.prepareStatement("");
con.setAutoCommit(false);//现将事物自动提交设为false
con.setTransactionIsolation(con.TRANSACTION_READ_COMMITTED);
PreparedStatement p = con.prepareStatement("insert into account(accountId,id,username) values("+id+",1,'jacky"+id+"')");
p.execute();
//con.prepareStatement("select * from account where accountId=7");
PreparedStatement p1 = con.prepareStatement("select * from account where accountId="+id);
ResultSet set = p1.executeQuery();
while(set.next()){
System.out.println(set.getRow()+"-"+set.getString(1)+"-"+set.getString(2)+"-"+set.getString(3));
}
int i =1/0;
con.commit();//提交
} catch (Exception e) {
System.out.println("exception");
// TODO Auto-generated catch block
try {
con.rollback();
} catch (SQLException e1) {
// TODO Auto-generated catch block
e1.printStackTrace();
}
}
}
}
三,结论以及注意
注意事项:autocommot必须设置为false;
com.mysql.jdbc.exceptions.jdbc4.MySQLNonTransientConnectionException : Can't call rollback when autocommit=true
而且异常的发生必须是在commit之前,否则也失效的.
结论就是,在事物回滚时,所有的更新新增操作都是无效,但是在con查询中这些都是最新影响的数据。
分享到:
相关推荐
例如,可以通过`JdbcTemplate`的`execute()`方法执行包含事务的SQL语句,并通过抛出异常来触发事务回滚。 **源码分析**:深入理解Spring JDBC事务管理的源码,可以帮助开发者更好地定制和优化事务处理。关键类如`...
该控制器提供了统一的事务管理方法,包括事务的提交、回滚和保存点等。该控制器也可以提供事务的timeout管理和事务传播控制。 四、事务模板的实现 事务模板是指提供模板方法对事务处理的代码进行控制。事务模板...
JDBC事务管理是数据库操作的重要组成部分,特别是在多用户并发访问数据库的环境中,保证数据的一致性和完整性至关重要。本文主要探讨了事务的基本概念、ACID原则、数据库并发问题以及解决方案。 首先,事务是数据库...
“JDBC事务管理项目”涵盖了如何在Java应用中利用JDBC进行事务控制,包括开启手动事务、提交、回滚以及设置事务隔离级别等。理解并掌握这些知识对于开发健壮的数据库应用至关重要,能够确保数据的完整性和一致性。
总之,这个“spring简单实例 事务回滚”案例为我们提供了一个学习Spring事务管理的好起点。通过理解如何配置事务管理器,使用`@Transactional`注解,以及异常处理机制,我们可以更好地掌握Spring如何保证数据的一致...
Spring JDBC事务管理 Spring框架提供了两种事务管理方式:编程式的事务管理(Programmatic transaction management)和声明式的事务管理(Declarative transaction management)。在本文中,我们将以JDBC事务管理...
在"Spring/SpringMVC/MyBatis整合+事务回滚"的主题中,我们将深入探讨如何将这三个框架整合起来,并实现事务的回滚功能。 首先,Spring框架是核心,它提供了依赖注入(DI)和面向切面编程(AOP)的能力,使得代码更...
通过设置SavePoint,我们可以创建一个事务内部的状态点,如果后续操作出现问题,可以将事务回滚到这个状态点,而不是回滚整个事务。使用`Connection`对象的`setSavepoint(String savepointName)`方法可以设置...
在JDBC中,事务管理包括开始事务、提交事务和回滚事务。 1. **JDBC事务的基本概念** - **事务**:事务是数据库系统中执行的一系列操作的集合,这些操作要么全部成功,要么全部失败。事务具有四大特性,即原子性...
总结一下,JDBC事务管理涉及开始事务、提交和回滚,以确保数据一致性。连接流是关于高效管理数据库连接的概念。DBCP和C3P0是常用的数据库连接池实现,它们提供了一种有效的连接管理和复用机制,提高了系统的效率和...
在Spring框架中,事务管理是核心特性之一,用于确保...通过运行这些测试,你可以看到事务管理如何在A方法调用B方法时工作,以及在异常情况下如何回滚事务。这个示例代码对于理解和调试Spring事务管理的问题非常有帮助。
**四、异常处理与事务回滚** 在JDBC中,如果在事务处理过程中出现异常,通常会自动回滚事务,以防止数据不一致。但为了保险起见,可以在finally块中添加对事务的回滚操作,确保即使在异常情况下也能正确处理事务。 ...
JDBC事务和JTA(XA)事务是两种常见的数据库事务类型,它们都可以用来管理数据库事务,确保数据库的一致性和可靠性。 JDBC事务 JDBC事务是Java Database Connectivity(JDBC)的事务机制,它可以将多个SQL语句组合成...
- 压缩包中的`Test_jdbc_tran`可能是一个测试文件,用于演示如何在JDBC操作中控制事务回滚。在单元测试中,可以使用`@Transactional`注解来开启事务,并在测试结束后自动回滚,确保测试环境的清洁。 8. **Spring ...
在数据库应用开发中,事务管理是一项重要的功能,它确保了一系列操作能够作为一个整体被正确地执行或回滚。Java Database Connectivity (JDBC) 是 Java 平台中用于连接数据库的标准 API,提供了丰富的功能来实现事务...
本资源主要介绍基于Spring JDBC的事务管理,包括事务的定义、使用 @Transactional 注解、Spring JDBC的事务管理机制、事务的ACID特性、事务的传播、事务的隔离等内容。 事务的定义 事务是一种数据库中能够保证一...
手动事务管理通常通过`Connection`对象的`setAutoCommit(false)`方法来关闭自动提交,然后通过`commit()`和`rollback()`方法来控制事务的提交和回滚。下面是一个简单的示例: ```java try (Connection conn = ...
总结来说,Java的JDBC提供了强大的事务管理能力,包括设置保存点以实现部分回滚。这对于处理复杂的业务逻辑和异常处理是非常有用的。正确理解和使用这些功能,可以帮助开发人员编写出更加健壮和灵活的数据库应用程序...
在Java数据库连接(JDBC)中,事务是用于管理数据库操作的一组逻辑单元。当一组相关的操作必须一起成功完成,或者如果其中任何一部分失败,则全部回滚,事务就显得尤为重要。在本例中,我们关注的是与MySQL数据库...
本文将深入探讨这个注解的工作原理、如何配置以及如何在遇到异常时触发事务回滚。 首先,`@Transactional`是Spring提供的一个编程式事务管理方式,它允许我们在方法上声明事务属性,如传播行为、隔离级别、读写模式...