事务
要么都成功,要么都失失败
ACID原则
A.原子性(atomicity,[ˌætəmˈɪsɪti]):要么全部完成,要么都不完成
C.一致性 (consistency):总数不变
I.隔离性(isolation): 多个进程互不干扰
D.持久性 (durability) :一旦提交不可逆,持久化到数据库了
隔离性的问题:
脏读:一个事务读取了另一个没有提交的事务
不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变。
虚读(幻读):在同一个事务内,读取到别人插入的数据,导致前后读出来结果不一致。
代码实现:
1.开启事务
conn.setAutoCommit(false);//开启事务
2.一组业务执行完毕,提交事务
3.可以在catch语句中显示的定义回滚语句,但默认失败就会回滚。
package com.kuang.lesson04;
import com.kuang.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 conn = null;
PreparedStatement st =null;
ResultSet rs = null;
try {
conn = JdbcUtils.getConnection();
// 关闭数据库的自动提交功能,自动会开启事务
conn.setAutoCommit(false);//开启事务
String sql1 = "update account set money = money-100 where name = 'A'";
st = conn.prepareStatement(sql1);
st.executeUpdate();
String sql2 = "update account set money = money-100 where name = 'B'";
st = conn.prepareStatement(sql2);
st.executeUpdate();
// 业务完毕,提交事务
conn.commit();
System.out.println("成功!");
conn.prepareStatement(sql1);
} catch (SQLException e) {
try {
conn.rollback();//如果失败则回滚事务
} catch(SQLException e1){
e1.printStackTrace();
}
e.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}