使用IDEA连接数据库
连接失败,查看原因
10.8、事务
要么都成功,要么都失败
ACID原则
原子性:要么全部完成,要么都不完成
一致性:总数不变
隔离性:多个进程互不干扰
持久性:一旦提交不可逆,持久化到数据库了
隔离性的问题:
脏读:一个事务读取了另一个没有提交的事务
不可重复读:在同一个事务内,重复读取表中的数据,表数据发生了改变
虚度(幻读):在一个事务内,读取到了别人插入的数据,导致前后读出来的结果不一致
代码实现
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-500 WHERE `name` = 'A' ";
st= conn.prepareStatement(sql1);
st.executeUpdate();
// int x =1/0;
String sql2 ="UPDATE `account` SET money = money+500 WHERE `name` = 'B' ";
st= conn.prepareStatement(sql2);
st.executeUpdate();
//业务完毕,提交事务
conn.commit();
System.out.println("操作成功!");
} catch (SQLException throwables) {
try {
conn.rollback();//如果失败则回滚事务
} catch (SQLException e) {
e.printStackTrace();
}
throwables.printStackTrace();
}finally {
JdbcUtils.release(conn,st,rs);
}
}
}
10.9数据库连接池
数据库连接 --- 执行完毕 --- 释放
连接 --- 释放 十分浪费资源
池化技术:准备一些预先的资源,过来就连接预先准备好的
s使用了这些数据库连接池之后,我们在项目开发中就不需要编写连接 数据库的代码了!
DBCP
需要用到的jar包
commons-dbcp-1.4、commons-pool-1.6
C3P0
需要用到的jar包
c3p0-0.9.5.5、mchange-commons-java-0.2.19
结论
无论使用什么数据源,本质还是一样的,DataSource接口不会变,方法就不会变。