java操作事务
一、回顾事务
通俗的理解,事务是一组原子操作单元,从数据库角度说,就是一组SQL指令,要么全部执行成功,若因为某个原因其中一条指令执行有错误,则撤销先前执行过的所有指令。更简答的说就是:要么全部执行成功,要么撤销不执行。
要么都成功,要么都失败
ACID原则
原子性: 要么全部完成,要么都不完成
一致性: 总数不变.
隔离性: 多个进程互不干扰
持久性: 一旦提交不可逆,持久化到数据库了
隔离性的问题:
脏读: 一个事务读取了另一一个没有提交的事务
不可重复读: 在同一个事务内,重复读取表中的数据,表数据发生了改变
虚读(幻读) : 在一个事务内,读取到了别人插入的数据,导致前后读出来结果不一致
二、Java中使用事务
JDBC事务
JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。
1 java.sql.Connection 提供了以下控制事务的方法:
2
3 public void setAutoCommit(boolean)
4 public boolean getAutoCommit()
5 public void commit()
6 public void rollback()
使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。
JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。
步骤:
- 开启事务:
conn.setAutoCommit(false);
- 一组事务执行完毕后,提交事务
conn.commit();
- 可以在catch语句中显式定义回滚语句,如果不写回滚语句数据库也会自动回滚
conn.rollback();
示例
package com.kuang.lesson03;
import com.kuang.lesson02.utils.JdbcUtils;
import java.sql.Connection;
import java.sql.PreparedStatement;
import java.sql.ResultSet;
import java.sql.SQLException;
public class TestTransaction {
public static void main(String[] args) {
Connection conn = null;
PreparedStatement pst = null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
//关闭数据库的自动提交,自动开启事务
conn.setAutoCommit(false);//开启事务
String sql1 = "update account set money=money-100 where name='a'";//a减100
pst = conn.prepareStatement(sql1);
pst.executeUpdate();
// int x=1/0;//报错
String sql2 = "update account set money=money+100 where name='b'";//b加100
pst = conn.prepareStatement(sql2);
pst.executeUpdate();
conn.commit();//业务完毕,提交事务
System.out.println("成功!");
} catch (SQLException e) {
// try {//如果失败,默认回滚
// conn.rollback();//如果失败,回滚
// } catch (SQLException ex) {
// ex.printStackTrace();
// }
e.printStackTrace();
}finally {
JdbcUtils.release(conn,pst,rs);
}
}
}
提交前:
提交后: