JAVA笔记概览 - JDBC(事务)

本文主要探讨了JAVA中使用JDBC进行数据库连接和事务管理,包括事务隔离级别的概念及示例。通过一个具体的事务操作案例,说明了在不同事务隔离级别下,数据读取的可见性情况。

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

JDBC 连接 与 事务

String url = "jdbc:mysql://localhost:3310/test?useSSL=false";
String user = "root";
String password = "root";
Connection conn = null;
PreparedStatement stmt = null;

try {
    Class.forName("com.mysql.jdbc.Driver");
    conn = DriverManager.getConnection(url, user, password);

    // 事务 1. 开启事务处理
    conn.setAutoCommit(false);

    String sql = "UPDATE test SET count=? WHERE id = ?";
    stmt = conn.prepareStatement(sql);
    stmt.setInt(1, 111);
    stmt.setInt(2, 1);
    stmt.executeUpdate();

    // 事务 2. 模拟中途可能出现故障
    Thread.sleep(10000);

    sql = "UPDATE test SET count=? WHERE id = ?";
    stmt = conn.prepareStatement(sql);
    stmt.setInt(1, 222);
    stmt.setInt(2, 2);
    stmt.executeUpdate();

    // 事务 3. 提交事务
    conn.commit(); 
} catch (Exception e) {
    // 事务 4. 事务回滚
    conn.rollback(); 
} finnally {
    if (stmt != null) {
        try {
            stmt.close();
        }
    }
    if (conn != null) {
        try {
            conn.close();
        }
    }
}

事务隔离级别

1. 脏读:  一个事务读取到另一个事务未提交的数据, 即 提交前后读取的数据都一样. 提交之前认为提交了
2. 不可重复读:  事务提交之前的数据 与提交之后的数据 读取的不一样
3. 虚读(幻读): 读取到了 别的事务插入的数据
4. 虚读不一定发生
count = 1 id = 1
count = 1 id = 2

update(count = 11 where id = 1)
sleep(10000)
update(count = 11 where id = 2)
commit();

query(count where id = 1)       
// 脏读 
//    count = 11   前  commit() 后     11
// 不可重复读
//    count = 1commit() 后      11

事务隔离示例

假设数据库有这么个数据

idcountother
1100-
2200-

执行 上面的事务代码

// 注意
// 事务 2. 模拟中途可能出现故障
Thread.sleep(10000);

其他连接过来读取这里的数据

String sql = "SELECT id, count FROM test WHERE id = ?";
PreparedStatement stmt = conn.prepareStatement(sql);
stmt.setInt(1, 1);
ResultSet rs = stmt.executeQuery();

while (rs.next()) {
    System.out.println(rs.getInt("id"));
    System.out.println(rs.getInt("count"));
}

只有等 sleep(1000) 之后的 conn.commit() 才会读取到修改后的值

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值