JDBC
SUN公司为了简化开发人员的(对数据库的统一)操作,提供了一个(java操作数据库的)规范,俗称JDBC
这些规范的实现由具体的厂商去做~
对于开发人员来说,我们只需要掌握JDBC接口的操作即可!
java.sql
javax.sql
还需要导入一个数据库驱动包 mysql-connector-java-5.1.47.jar
JDBC操作事务
==要么都成功,要么都失败==
ACID原则
原子性:要么全部成功,要么全部失败
一致性:总数不变
隔离性:多个进程互不干扰
持久性:一旦提交不可逆,持久化到数据库了
隔离性的问题:
脏读:一个事务读取了另外一个没有提交的事务
不可重复读:在同一个事务内,重复读取表中数据,表数据发生了改变
幻读:在一个事务内,读取到了别人插入的数据,导致前后读出来的结果不一致
代码实现
- 开启事务
con.setAutoCommit(false);
- 一组业务执行完毕,提交事务
- 可以在catch语句中显示的定义回滚语句,但是默认失败就会回滚
正常情况
import com.zyy.lesson02.utils.JDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestTransaction1 { public static void main(String[] args) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = JDBCUtils.getConnection(); //关闭自动提交 自动会开启事务 con.setAutoCommit(false);//开启事务 // A 转 B 100元 String sql1 = "update account set money=money-100 where name='A'"; ps = con.prepareStatement(sql1); ps.executeUpdate(); String sql2 = "update account set money=money+100 where name='B'"; ps = con.prepareStatement(sql2); ps.executeUpdate(); //业务完毕,提交事务 con.commit(); System.out.println("A 转 B 100元 成功!"); } catch (SQLException e) { e.printStackTrace(); try { con.rollback(); } catch (SQLException ex) { ex.printStackTrace(); } } finally { JDBCUtils.release(con, ps, rs); } } }
异常情况
import com.zyy.lesson02.utils.JDBCUtils; import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.ResultSet; import java.sql.SQLException; public class TestTransaction2 { public static void main(String[] args) { Connection con = null; PreparedStatement ps = null; ResultSet rs = null; try { con = JDBCUtils.getConnection(); //关闭自动提交 自动会开启事务 con.setAutoCommit(false);//开启事务 // A 转 B 100元 String sql1 = "update account set money=money-100 where name='A'"; ps = con.prepareStatement(sql1); ps.executeUpdate(); //默认失败 int x = 1/0; //一定会异常 String sql2 = "update account set money=money+100 where name='B'"; ps = con.prepareStatement(sql2); ps.executeUpdate(); //业务完毕,提交事务 con.commit(); System.out.println("A 转 B 100元 成功!"); } catch (SQLException e) { e.printStackTrace(); //如果异常,默认也会回滚,下面不写也可以 // try { // con.rollback(); // } catch (SQLException ex) { // ex.printStackTrace(); // } } finally { JDBCUtils.release(con, ps, rs); } } }