事务Transaction
指一组操作,里面包含许多个单一的逻辑。只要有一个逻辑没有执行成功,那么都算失败。 所有的数据都回归到最初的状态(回滚)
MySQL数据库命令行操作
开启事务
start transaction;
提交或者回滚事务
1、commit; 提交事务, 数据将会写到磁盘上的数据库
2、rollback ; 数据回滚,回到最初的状态。
关闭自动提交
1、查看是否自动提交
show variables like '%commit%'
2、关闭自动提交
set autocommit=off
java开启事务操作数据库
1、事务默认就是自动提交的。通过conn.setAutoCommit(false )来关闭自动提交的设置。(事务开启是针对链接conn)
2、提交事务 conn.commit();
3、回滚事务 conn.rollback();
事务的特性ACID(work)
1、原子性(Atomicity):事务中的逻辑要全部执行,不可分割
2、一致性(Consistency):事务执行前后,数据的完整性一致
3、隔离性(Isolation):一个事务在执行的过程中不应该受到其他事务的影响
4个隔离级别:
①Read Uncommitted:读未提交
②Read Committed:读已提交
③Repeatable Read:重复读 MySQL默认的隔离级别
④Serializable:可串行化
4、持久性(Durability):事务执行结束,即完成提交或回滚,数据应该持久化到数据库中
由隔离性引起的安全问题
读问题
*1、脏读:一个事务读到另一个事务还未提交的数据
引发情况:隔离级别设置为Read Uncommitted:读未提交
解决:将隔离级别至少设置为Read Committed:读已提交
*2、不可重复读:一个事务读取到另一个事务提交的数据,导致多次查询结果不一致
引发情况:将隔离级别设置为Read Committed:读已提交
解决:将隔离级别至少设置为Repeatable Read:重复读
3、幻读:一个事务读取到另一个事务已提交的插入的数据,导致多次查询结果不一致
引发情况:将隔离级别设置为Repeatable Read:重复读
解决:将隔离级别至少设置为Serializable:可串行化
写问题
丢失更新
数据连接池
企业中大多使用c3p0数据库连接池
DBCP
需要的jar包
mysql-connector-java-5.1.46-bin.jar
commons-pool-1.5.6.jar
commons-dbcp-1.4.jar
1、不使用配置文件的代码
packagecom.pool.demo;importjava.sql.Connection;importjava.sql.PreparedStatement;importjava.sql.SQLException;importorg.apache.commons.dbcp.BasicDataSource;/*** 不使用配置文件
*@authorDell
**/
public classDBCPDemo {public static voidmain(String[] args) {
Connection conn= null;
PreparedStatement ps= null;try{//1、构建数据源对象
BasicDataSource dataSource = newBasicDataSource() ;
dataSource.setUrl("jdbc:mysql://localhost:3306/hm_study");
dataSource.setDriverClassName("com.mysql.jdbc.Driver");
dataSource.setUsername("root");
dataSource.setPassword("tiger");//2、获取数据库连接对象
conn =dataSource.getConnection() ;//3、插入一条数据
String sql = "insert into user values(null,?,?)";
ps=conn.prepareStatement(sql) ;
ps.setString(1, "aa");
ps.setString(2, "aa123");
ps.executeUpdate() ;
}catch(SQLException e) {
e.printStackTrace();
}finally{if(ps != null) {try{
ps.close();
}catch(SQLException e) {
e.printStackTrace();
}
}if(conn != null) {try{
conn.close(