jdbc—事务
1.事务的基本概念(查询是没有事务的)
- 一组要么同时执行成功,要么同时执行失败的SQL语句。是数据库操作的一个执行单元。
- 事务开始于:
- 连接到数据库上,并执行一条DML语句(INSERT,UPDATE或DELETE)。
- 前一个事务结束后,又输入了另一条DML语句。
- 事务结束于:
- 执行COMMIT或ROLLBACK语句。
- 执行一条DDL语句,例如CREATE TABLE语句;在这种情况下,会自动执行COMMIT语句。
- 执行一条DCL语句,例如GRANT语句;在这种情况下,会自动执行COMMIT语句。
- 断开与数据库的连接。
- 执行了一条DML语句,该语句却失败了,在这种情况中,或为这个无效的DML语句执行ROLLBACK语句。
2.事务的四大特点(ACID)
- atomictiy(原子性)
表示一个事务内的所有操作是一个整体,要么全部成功,要么全部失败。
- consistency(一致性)
表示一个事务内有一个操作失败时,所有更改过的数据都必须回滚到修改前的状态。
- isolation(隔离性)
事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,要么是另一事务修改它之后的数据,事务不会查看
中间状态的数据
- 事务隔离级别从低到高(效率从高到低):
- 读取未提交(Read Uncommited)
- 读取已提交(Read commited)
- 可重复读(Repeatable Read)
- 序列化(serializable)(锁表)
- durability(持久性)
持久性事务完成之后,它对于系统的影响是永久性的。
package com.yf.jdbc.test; import java.sql.Connection; import java.sql.DriverManager; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; /** * 测试事务 * @author yangf * */ public class Demo06 { public static void main(String[] args) { Connection con = null; PreparedStatement ps1 = null; PreparedStatement ps2 = null; try { // 加载数据库驱动 Class.forName("com.mysql.jdbc.Driver"); // 获得connection对象 建立与数据库连接 con = DriverManager.getConnection("jdbc:mysql://localhost:3306/testjdbc", "root", "123456"); // JDBC中默认自动提交事务 con.setAutoCommit(false); ps1 = con.prepareStatement("insert into t_user (username,pwd) values (?,?)"); ps1.setString(1, "yyf"); ps1.setInt(2, 22222); ps1.execute(); System.out.println("插入一个用户yyf"); try { Thread.sleep(5000); } catch (InterruptedException e) { e.printStackTrace(); } ps2 = con.prepareStatement("insert into t_user (username,pwd) values (?,?,?)"); ps2.setString(1, "wwwy"); ps2.setInt(2, 3333); ps2.execute(); System.out.println("插入一个用户wwwy"); con.commit(); } catch (ClassNotFoundException e) { e.printStackTrace(); try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } catch (SQLException e) { e.printStackTrace(); try { con.rollback(); } catch (SQLException e1) { e1.printStackTrace(); } } finally { if (ps1 != null) { try { ps1.close(); } catch (SQLException e) { e.printStackTrace(); } } if (con != null) { try { con.close(); } catch (SQLException e) { e.printStackTrace(); } } } } }