JDBC编程的事务处理

一、事务的基本概念

数据库是一个多用户使用的共享资源。当多个用户并发地存取数据的时候,在数据库中就会产生多个用户同时存取同一数据的情况。若对并发操作不加控制,就可能会产生读取和存储不正确的数据,破坏数据的一致性。

而事务是并发控制的基本单位。所谓事务,即一个操作序列。这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。比如银行转账工作:从一个账户扣款,并使用另一个账户收款,这两个操作要么都执行,要么都不执行,因此应该把它们看作是一个事务。

事务是数据库维护数据一致性的单位,在每个事务结束时,都能保持数据的一致性。

对于编程人员来说,可以把数据库事务看作是一组sql语句,这组sql语句是一个逻辑工作单元,它们是不可分割的,它们的执行结果应该作为一个整体永久修改一个数据库的内容或者作为一个整体取消对数据库的修改。

二、事务的四个基本特征

1.原子性

原子性是指事务中包含的操作都被看作是一个逻辑单元,这个逻辑单元中的操作要么全部成功,要么全部失败。这也意味着事务中的所有元素作为一个整体提交或回滚。事务的所有元素是不可分割的,是一个完整的操作。

2.一致性

一致性是指事务开始之前和事务结束以后数据库都处于一致性状态,数据库的完整性约束没有被破坏。

3.隔离性

隔离性是指对数据库进行修改的多个事务是彼此隔离的。这说明事务必须是独立的,不应该以任何形式影响其他事务

4.持久性

持久性是指事务完成之后对于数据库的影响是永久的,该修改真实地修改了数据库,即使数据库出现故障也会一直保留。

三、与SQL相关的事务语句

开始事务:BEGIN TRANSACTION

提交事务:COMMIT TRANSATION

回滚事务:ROLLBACK TRANSATION

package com.eduask.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.SQLException;
import java.sql.Statement;

/*将要测试的逻辑
  保存一个用户Tom的基本信息和Tom的地址信息
  分别通过两个java方法插入到用户表和地址表中 
  在插入地址表的时候人为造成一个异常
  观察结果
 */
public class TransactionTest {

	//创建一个getConnection()用来获取数据库的连接
	public static Connection getConnection(){
		Connection conn = null;

		try {
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/testdemo","root","root");
		} catch (Exception e) {
			e.printStackTrace();
		}

		return conn;
	}

	public static void insertUserData(Connection conn) throws SQLException{
			String sql = "insert into tbl_user(id,name,password,email) "
					+ "values(10,‘Tom‘,‘123456‘,‘[email protected]‘)";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向用户插入了 "+ count + " 条记录");
	}

	public static void insertAddressData(Connection conn) throws SQLException{
			String sql = "insert into tbl_address(id,city,country,user_id) "
					+ "values(1,‘ShangHai‘,‘China‘,‘10‘)";
			Statement st = conn.createStatement();
			int count = st.executeUpdate(sql);
			System.out.println("向地址表中插入了 "+ count + " 条记录");
	}

	public static void main(String[] args) {
		Connection conn = null;
		try {
			conn = getConnection();
			conn.setAutoCommit(false);

			insertUserData(conn);
			insertAddressData(conn);

			conn.commit();
		} catch (SQLException e) {
			System.out.println("=========捕获到SQL异常=========");

			e.printStackTrace();
			try {
				conn.rollback();//回滚事务,保证数据库数据的一致性
				System.out.println("=========事务回滚成功=========");
			} catch (Exception e2) {
				e2.printStackTrace();
			}
		}finally{
			try {
				if (conn != null) {
					conn.close();
				}
			} catch (Exception e3) {
				e3.printStackTrace();
			}
		}
	}

}
时间: 2024-10-16 00:59:24

JDBC编程的事务处理的相关文章

JDBC编程之事务处理

JDBC中的事务处理指的是事务的一致性等问题,例如插入一条数据(id,name,password)到表中,另一条数据(address,id)到另一张表中,并且两条数据是相关联的,那么假设第一条数据插入成功,但是第二条数据由于异常没有插入成功,那么此时为了保证事务的一致性.完整性,则两条数据都不能够插入. 1. 创建Conn连接类 Conn.java 1 package com.test.conn; 2 3 import java.sql.Connection; 4 import java.sql

JDBC编程总结

JDBC编程总结 JDBC的基本原理JDBC是Java操作数据库的技术规范.他实际上定义了一组标准的操作数据库的接口.为了能让Java操作数据库,必须要有实现了JDBC这些接口的类,不同的数据库厂商为了让Java语言能操作自己的数据库,都提供了对JDBC接口的实现--这些实现了JDBC接口的类打成一个jar包,就是我们平时看到的数据库驱动.由于不同的数据库操作数据的机制不一样,因此JDBC的具体实现也就千差万别,但是你作为java程序员,你只和Java JDBC的接口打交到,才不用理会他们怎么实

JSP (3)------JDBC编程1

JDBC API : 是一系列的编程接口,可以用来连接数据库,访问数据等. DriverManager : 驱动程序管理类,用来装载驱动程序,为创建数据库连接提供支持. Connection:用于连接某一指定的数据库 Statement : 提供了执行sql语句,获取查询结果的方法.有两个子接口.分别是: PrepareStatement:用于执行预编译的sql语句 ResultSet : 提供了对结果集处理的方法 JDBC Driver API 是面向驱动程序开发商的接口,JDBC驱动程序主要

JavaEE之JDBC编程[详解]

1.数据库简介 数据库(DB,Data Base ) 数据库管理系统(DBMS,Data Base Management System) 关系型数据库(RDB) 关系型数据库管理系统(RDBMS) SQL语言(Structured Query Language):使用关系模型的数据库语言,用于和各类数据库的交互,提供通用的数据管理和查询功能. 常用SQL指令:(CURD) SELECT .INSERT.DELETE.UPDATE.CREATE.DROP ODBC(Open DataBase Co

第十三章.MySQL数据库与JDBC编程(下)

JDBC的典型用法: JDBC4.2常用接口和类简介: DriverManager:用于管理JDBC驱动的服务类,程序中使用该类的主要功能是获取Connection对象,该类包含如下方法: public static synchronized Connection getConnection(String url, String user, String  pass) throws SQLException:该方法获得url对应数据库的连接 Connection:代表数据库连接对象,每个Conn

第13章 MySQL数据库与JDBC编程

13.1 JDBC基础 13.1.1 JDBC简介 13.1.2 JDBC驱动程序 13.2 SQL语法 13.2.1 安装数据库 13.2.2 关系数据库基本概念和MySQL基本命令 13.2.3 SQL语句基础 13.2.4 DDL语言 13.2.5 数据库约束 13.2.6 索引 13.2.7 视图 13.2.8 DML语句语法 13.2.9 单表查询 13.2.10 数据库函数 13.2.11 分组和组函数 13.2.12 多表连接查询 13.2.13 子查询 13.2.14 集合查询

JDBC编程之预编译SQL与防注入式攻击以及PreparedStatement的使用教程

在JDBC编程中,常用Statement.PreparedStatement 和 CallableStatement三种方式来执行查询语句,其中 Statement 用于通用查询, PreparedStatement 用于执行参数化查询,而 CallableStatement则是用于存储过程. 1.Statement       该对象用于执行静态的 SQL 语句,并且返回执行结果. 此处的SQL语句必须是完整的,有明确的数据指示.查的是哪条记录?改的是哪条记录?都要指示清楚.     通过调用

JDBC编程的步骤

一.进行JDBC编程的步骤大致如下: 1.      加载数据库驱动,通常使用Class类的forName()静态方法来加载驱动.如下代码: Class.forName(dirvirClass) 上面代码中的driverClass就是数据库驱动类所对应的字符串 加载MySQL数据库时采用的代码为: Class.forName("com.mysql.jdbc.Driver"); 2.      通过DriverManager获取数据库连接. DriverManager.getConnec

JDBC编程 之 增删改查

JDBC编程之数据增加,更改,查询,删除 1 package com.good.jdbc; 2 3 import java.sql.Connection; 4 import java.sql.DriverManager; 5 import java.sql.ResultSet; 6 import java.sql.Statement; 7 8 public class Main { 9 //1数据库连接的方法就独立出来了 10 public static Connection getConnec