JDBC数据库操作_06事务

本文深入探讨数据库事务的基本概念及ACID特性,包括原子性、一致性、隔离性和持久性,解析事务如何确保数据完整性和并发控制。通过示例代码展示如何在Java中使用JDBC进行事务管理。

摘要生成于 C知道 ,由 DeepSeek-R1 满血版支持, 前往体验 >

事务

基本概念:一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元

  1. 事务开始于:
    连接到数据库上,并执行了一条DML语句(insert update delete)
    前一个事务结束后,有输入了另一条DML语句
  2. 事物结束于:
    执行commit或rollback语句
    执行一条DDL语句,例如:create table语句;在这种情况下,会自动执行commit语句
    执行一条DCL语句,例如:grant语句;在这种情况下,会自动执行commit语句
    断开与数据库的连接
    执行了一条DML语句,该语句却失败了;在这种情况中,会为这个无效的DML语句执行rollback语句

事务的四大特点(ACID)

  1. 原子性(atomicity)
    表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败
  2. 一致性(consistency)
    表示一个事务内有一个操作失败时,所有的更改过的数据都必须去回滚到修改前的状态
  3. 隔离性(isolation)
    事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看中间状态的数据
  4. 持久性(durability)
    持久性事务完成之后,它对系统的影响是永久性的

事务隔离级别从低到高:(了解即可)

  1. 读取未提交
  2. 读取已提交
  3. 可重复读
  4. 序列化
    注:一般是读取已提交,越往前效率越高
    事务的示例:
package com.first.jdbc;

import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
import java.sql.Statement;
/**
 * 测试事务的基本概念和用法
 */
public class Demo05 {
	public static void main(String[] args) {
		Connection conn = null;
		PreparedStatement ps1 = null;
		PreparedStatement ps2 = null;
		try {
			//加载驱动类
			Class.forName("com.mysql.jdbc.Driver");
			conn = DriverManager.getConnection("jdbc:mysql://localhost:3306/jdbc","root","root");
			
			conn.setAutoCommit(false); //JDBC中默认是true,自动提交事务
			
			ps1 = conn.prepareStatement("insert into t_user (username,pwd) values (?,?)");
			ps1.setObject(1, "代红3");
			ps1.setObject(2, "111");
			ps1.execute();
			System.out.println("插入代红3");
			
			try {
				Thread.sleep(6000);
			} catch (InterruptedException e) {
				e.printStackTrace();
			}
			//第二条语句报错,且两条语句在同一个事务中。同时失败了
			ps2 = conn.prepareStatement("insert into t_user (username,pwd) values (?,?,?)");
			ps2.setObject(1, "代红4");
			ps2.setObject(2, "222");
			ps2.execute();			
			System.out.println("插入代红4");
			
			
			conn.commit();
		} catch (ClassNotFoundException e) {
			e.printStackTrace();
			try {
				conn.rollback();	//回滚
			} catch (SQLException e1) {
				e1.printStackTrace();
			}
		} catch (SQLException e) {
			e.printStackTrace();
		}finally{
			try {
				if(ps1!=null){
					ps1.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
			try {
				if(conn!=null){
					conn.close();
				}
			} catch (SQLException e) {
				e.printStackTrace();
			}
		}
	}
}

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值