jdbc 事物
一、什么是事务?
事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
二、事务是必须满足4个条件(ACID)
事务的原子性( Atomicity):一组事务,要么成功;要么撤回。
一致性 (Consistency):事务执行后,数据库状态与其他业务规则保持一致。如转账业务,无论事务执行成功否,参与转账的两个账号余额之和应该是不变的。
隔离性(Isolation):事务独立运行。一个事务处理后的结果,影响了其他事务,那么其他事务会撤回。事务的100%隔离,需要牺牲速度。
持久性(Durability):软、硬件崩溃后,InnoDB数据表驱动会利用日志文件重构修改。可靠性和高速度不可兼得, innodb_flush_log_at_trx_commit 选项 决定什么时候吧事务保存到日志里
三.jdbc事物:
JDBC处理事务的代码格式:
try{ con.setAutoCommit(false);//开启事务 ...... con.commit();//try的最后提交事务 } catch() { con.rollback();//回滚事务 }
示例:
import java.sql.Connection; import java.sql.DriverManager; import java.sql.SQLException; import java.sql.Statement; public class Text { public static void main(String[] args) { String url = "jdbc:mysql://127.0.0.1:3306/test?useUnicode=true&characterEncoding=utf-8"; String username = "root"; String password = "1234"; Connection conn = null; try { //1.加载驱动 Class.forName("com.mysql.jdbc.Driver"); //2.连接数据库 conn = DriverManager.getConnection(url, username, password); //3.通知数据库开启事物,false代表开启 conn.setAutoCommit(false); //4.创建sql语句 String sql1 = "update accout set money = money-100 where name = 'A'"; conn.prepareStatement(sql1).executeUpdate(); String sql2 = "update accout set money = money+100 where name = 'B'"; conn.prepareStatement(sql2).executeUpdate(); //5.提交事物: 上面的两个sql语句都执行成功了 才会提交 conn.commit(); } catch (Exception e) { try { //如果出现异常就通知数据库回滚事物 conn.rollback(); } catch (SQLException throwables) { throwables.printStackTrace(); } e.printStackTrace(); } } }