1.事务
开启事务:start transaction;
回滚事务:rollback;
提交事务: commit;
关闭自动提交事务:setAutoCommit(false);
1.1事务的特性ACID【】
1.原子性【A】:事务包含的逻辑不可分割
一致性【C】:事务执行前后,数据完整性
隔离性【I】 :事务执行期间不受其他事务影响
持久性【D】:事务执行成功,则数据永久保存到磁盘上;
1.1.2.事务的安全隐患:
不考虑隔离级别设置:
【读】:
1.脏读:>>>一个事务读到另外一个事务还未提交的数据;
2.不可重复读:>>>一个事务读到了另外一个事务提交的数据,造成两次查询结果不一致;>>>解决:重复读:repeatable read;【默认】
3.幻读:一个事务读到另外一个事务已提交插入的数据,导致多次查询结果不一致。>>>>解决:Serializable【可串行化】最高级别
四个隔离级别的效率从高到低排列:
读未提交>读已提交>可重复读>可串行化
拦截程度相反
【写】:丢失更新
>>>解决:1.悲观锁;
======== 2.乐观锁
【mysql默认隔离级别:可重复读】
【oracle默认隔离级别:读已提交】
1.1.3在代码中使用事务的步骤
Connection conn = JDBCUtil.getConn();
conn.setAutoCommit(false);//关闭事务的自动提交
.....
conn.commit();//提交
conn.roolback();//回滚
2.数据库连接池
2.1DBCP连接池【了解】
dbcp创建dataSource方式:
BasicDataSource dataSource = new BasicDataSource();
2.1.1使用代码方式连接【了解】
将数据插入到bank下的account表中
public class demo1 {
@Test
public void dbcp(){
Connection conn = null;
PreparedStatement ps = null;
try {
//1.构建数据源对象
BasicDataSource dataSource = new BasicDataSource();
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUrl("jdbc:mysql://localhost/bank");
dataSource.setUsername("root");
dataSource.setPassword("123456");
//2.获得连接对象
conn = dataSource.getConnection();
String sql = "insert into account values(null,?,?)";
ps = conn.prepareStatement(sql);
ps.setString(1, "admin");
ps.setInt(2, 20000);
ps.executeUpdate();
} catch (SQLException e) {
e.printStackT