`

初始Jdbc事务处理

阅读更多
在数据库中,所谓事务是指一组逻辑操作单元,使数据从一种状态变换到另一种状态。

为确保数据库中数据的一致性,数据的操纵应当是离散的成组的逻辑单元:当它全部完成时,数据的一致性可以保持,而当这个单元中的一部分操作失败,整个事务应全部视为错误,所有从起始点以后的操作应全部回退到开始状态。

事务的操作:先定义开始一个事务,然后对数据作修改操作,这时如果提交(COMMIT),这些修改就永久地保存下来,如果回退(ROLLBACK),数据库管理系统将放弃您所作的所有修改而回到开始事务时的状态。

  事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写事务必须服从ISO/IEC所制定的ACID原则。ACID是原子性(atomicity)、一致性(consistency)、隔离性(isolation)和持久性(durability)的缩写。

     原子性。即不可分割性,事务要么全部被执行,要么就全部不被执行。如果事务的所有子事务全部提交成功,则所有的数据库操作被提交,数据库状态发生转换;如果有子事务失败,则其他子事务的数据库操作被回滚,即数据库回到事务执行前的状态,不会发生状态转换。

     一致性或可串性。事务的执行使得数据库从一种正确状态转换成另一种正确状态。(数据不被破坏)

    隔离性。事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰。

    持久性。事务正确提交后,其结果将永久保存在数据库中,即使在事务提交后有了其他故障,事务的处理结果也会得到保存。   

  运行嵌入式SQL应用程序或脚本,在可执行SQL语句第一次执行时(在建立与数据库的连接之后或在现有事务终止之后),事务就会自动启动。在启动事务之后,必须由启动事务的用户或应用程序显式地终止它,除非使用了称为自动提交(automatic commit)的过程(在这种情况下,发出的每个单独的SQL语句被看做单个事务,它一执行就被隐式地提交了)。

  在大多数情况下,通过执行COMMIT或ROLLBACK语句来终止事务。当执行COMMIT语句时,自从事务启动以来对数据库所做的一切更改就成为永久性的了-- 即它们被写到磁盘。当执行ROLLBACK语句时,自从事务启动以来对数据库所做的一切更改都被撤销,并且数据库返回到事务开始之前所处的状态。不管是哪种情况,数据库在事务完成时都保证能回到一致状态。

  JDBC中的事务:
事务:指构成单个逻辑工作单元的操作集合
事务处理:保证所有事务都作为一个工作单元来执行,即使出现了故障,都不能改变这种执行方式。当在一个事务中执行多个操作时,要么所有的事务都被提交(commit),要么整个事务回滚(rollback)到最初状态
在JDBC中,事务默认是自动提交的,每次执行一个 SQL 语句时,如果执行成功,就会向数据库自动提交,而不能回滚
为了让多个 SQL 语句作为一个事务执行:
调用 Connection 对象的 setAutoCommit(false); 以取消自动提交事务
在所有的 SQL 语句都成功执行后,调用 commit(); 方法提交事务
在出现异常时,调用 rollback(); 方法回滚事务
可以通过Connection的getAutoCommit()方法来获得当前事务的提交方式

示例:银行转账的例子,要求张三给李四转1000元.
package cn.itcast.cd;

import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;

import org.junit.Test;

import cn.itcast.cd.utils.DbUtils;

public class TestTransaction {
	
	/*
	 * 需求:张三给李四转账1000元
	 * 
	 * 转账成功的条件:
	 * 1、判断张三的账号余额是否>=1000
	 * 2、从张三的账号中转出1000.
	 * 3、给李四的账号中转入1000.
	 */
	@Test
	public void testTrans(){
		Connection connection = DbUtils.getConnection();
		try {

			//开启事务,默认的情况下是true,  只要执行sql就开启事务物,执行完sql后就提交事务
			connection.setAutoCommit(false);
			
			PreparedStatement preparedStatement = null;
			ResultSet resultSet = null;
			String sql = "";
			try {
				sql = "select * from accounts where name=?"; 
				preparedStatement = connection.prepareStatement(sql);
				preparedStatement.setString(1, "张三");
				
				resultSet = preparedStatement.executeQuery();
				if (resultSet.next()){
					Double sum = resultSet.getDouble("sum");
					
					//判断余额
					if (sum < 1000){
						System.out.println("余额不足,操作失败!");
						return;
					}
					
					//转出
					sql = "update accounts set sum=sum-? where name=?";
					preparedStatement = connection.prepareStatement(sql);
					preparedStatement.setInt(1, 1000);
					preparedStatement.setString(2, "张三");
					preparedStatement.executeUpdate();
					
					
					//创建异常,没有事务则转出了1000,发生异常,转入失败,整个转账操作失败!
					int a = 2/0;
					
					//转入
					sql = "update accounts set sum=sum+? where name=?";
					preparedStatement = connection.prepareStatement(sql);
					preparedStatement.setInt(1, 1000);
					preparedStatement.setString(2, "李四");
					preparedStatement.executeUpdate();	
					
					//提交事务,表明整个转账操作成功,将修改的数据更新到数据库中, 事务就又变成了自动提交.
					connection.commit();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			} finally{			
				DbUtils.close(connection, preparedStatement, resultSet);
			}
		} catch (Exception e) {
			e.printStackTrace();
			
			//发生异常,事务回滚到原始状态.
			try {
				connection.rollback();
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		}
	}
}
分享到:
评论

相关推荐

    JDBC笔记 JDBC笔记

    同时也有一些高级的处理,比如批处理更新、事务隔离和可滚动结果集等。 ② javax.sql 扩展功能。它主要为数据库方面的高级操作提供了接口和类。如为连接管理、分布式事务和旧有的连接提供了更好的抽象,它引入了...

    jdbc基础和参考

    JDBC:本身自动帮我做事务管理的操作 AutoCommit = true; Connection.setAutoCommit(false); 正常: conn.commit(); 异常: conn.rollback(); JDBC批处理: addBatch executeBatch Statement ...

    【分布式事务----LCN】LCN原理及使用方式.docx

    `ex_state` tinyint(4) NULL DEFAULT NULL COMMENT '0 待处理 1已处理', `remark` varchar(10240) NULL DEFAULT NULL COMMENT '备注', `create_time` datetime(0) NULL DEFAULT NULL, PRIMARY KEY (`id`) USING ...

    java8stream源码-mjdbc:小而高效的JDBC包装器

    行初始化代码后开始使用它。 可靠:所有 SQL 语句都在应用程序启动时进行解析和验证。 灵活:在需要时直接切换和使用原生 JDBC 接口。 快速:与 JDBC 相比没有运行时开销。 事务性:将任何方法包装到事务中。 真正的...

    Spring in Action(第2版)中文版

    目录 第一部分spring的核心 第1章开始spring之旅 1.1spring是什么 1.2开始spring之旅 1.3理解依赖注入 ...b.3.2综合测试事务处理对象 b.3.3测试数据库 b.3.4使用gienahtesting在junit4中进行测试 b.4小结

    Spring in Action(第二版 中文高清版).part2

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 ...B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在JUnit 4中进行测试 B.4 小结

    Spring in Action(第二版 中文高清版).part1

    第一部分 Spring的核心 第1章 开始Spring之旅 1.1 Spring是什么 1.2 开始Spring之旅 ...B.3.2 综合测试事务处理对象 B.3.3 测试数据库 B.3.4 使用Gienah Testing在JUnit 4中进行测试 B.4 小结

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务

    基于 SpringBoot 多数据源 动态数据源 主从分离 快速启动器 支持分布式事务。一个基于springboot的快速集成多数据源的启动器。支持 数据源分组 ,适用于多种场景 纯粹多库 读写分离 一主多从 混合模式。支持数据库...

    spring.doc

    Lazy-init初始化bean的时机拓展: 15 3.4 Bean的作用域 16 Scope单例多例作用域拓展: 16 3.4.1 singleton(默认值) 16 3.4.2 prototype 17 3.4.3 Request 17 3.4.4 Session 18 3.4.5 Global session 18 3.4.6 指定...

    Spring源码解析4章150页+Spring3.2.4中文注释源码

    3、源码分析-IOC容器的初始化 4、源码分析-IOC容器的依赖注入 5、源码分析-IOC容器的高级特性 三阶段 Spring AOP的涉及原理及具体实践 SpringJDBC的涉及原理及二次开发 SpringMVC框架设计原理及手写实现 四阶段 ...

    Spring.html

    概念:面向切面编程,在不改变源码的情况下对方法进行增强,抽取横切关注点(日志处理,事务管理,安全检查,性能测试等等),使用AOP进行增强,使程序员只需要关注与业务逻辑编写. 专业术语 目标Target:需要增强的类 ...

    Spring中文帮助文档

    11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...

    java面试800题

    Q0060 JDBC批量更新的作用和用法 "提高执行效率。减少执行时间。 Statement sm = cn.createStatement(); sm.addBatch(sql1); sm.addBatch(sql2); ... sm.executeBatch() 或者 PreparedStatement ps = ...

    高性能的分布式数据库连接池clearpool.zip

    能够在数据库重启时重新初始化连接池。  能够自动回收空闲连接。  能够加密配置文件中的数据库密码。  关于clearpool的详细介绍请参考博客:...

    Spring API

    11.2. 利用JDBC核心类控制JDBC的基本操作和错误处理 11.2.1. JdbcTemplate类 11.2.2. NamedParameterJdbcTemplate类 11.2.3. SimpleJdbcTemplate类 11.2.4. DataSource接口 11.2.5. SQLExceptionTranslator接口...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part4

     20.5 Java应用通过Hibernate API声明JDBC事务  20.5.1 处理异常  20.5.2 Session与事务的关系  20.5.3 设定事务超时  20.6 Java应用通过Hibernate API声明JTA事务  20.7 Java应用通过JTA API声明JTA事务  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part2

     20.5 Java应用通过Hibernate API声明JDBC事务  20.5.1 处理异常  20.5.2 Session与事务的关系  20.5.3 设定事务超时  20.6 Java应用通过Hibernate API声明JTA事务  20.7 Java应用通过JTA API声明JTA事务  ...

    精通 Hibernate:Java 对象持久化技术详解(第2版).part3

     20.5 Java应用通过Hibernate API声明JDBC事务  20.5.1 处理异常  20.5.2 Session与事务的关系  20.5.3 设定事务超时  20.6 Java应用通过Hibernate API声明JTA事务  20.7 Java应用通过JTA API声明JTA事务  ...

Global site tag (gtag.js) - Google Analytics