一、jdbc数据库基本操作
二、事务
事务原则就是一个业务逻辑需要处理一个或者多个数据时,必须保证所有操作完成或者某一个操作失败时,数据恢复到原有的状态。
事务的四个属性:
原子性:可理解为一个整体工作单位,原子则代表不可再拆分的事物,所以同个事务的操作要么都完成,要么都不完成。
一致性:从一个一致状态变更到另一种一致的状态,也可以由原子性得出。
持久性:事务提交后,则数据不再因其他操作发生变更。
隔离性:不同事务互不干扰。
package com.ruqi.prepareStatment;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
// 连接的工具类见上篇文章
// 处理事务,确保所有的操作同一个连接对象即可,因此要把连接对象当作变量上传
public class DealShiWu {
@Test
public void updateTest(){
Connection conn = null;
try{
conn = ConnectUtil.getConnection();
conn.setAutoCommit(false);
String sql1 = "UPDATE Scores set score = score - 100 where id = ?;";
// System.out.println(10 / 0);
String sql2 = "UPDATE Scores set score = score - 100 where id = ?;";
update(conn,sql1,1);
update(conn,sql2,2);
conn.commit();
System.out.println("事务处理成功");
}catch (Exception exception){
exception.printStackTrace();
try{
conn.rollback();
}catch (Exception e){
e.printStackTrace();
}
}finally {
try {
// 针对连接池可能使用到同个连接,因此需要重新将连接设置会自动提交,避免影响其他操作
conn.setAutoCommit(true);
}catch (Exception e){
e.printStackTrace();
}
ConnectUtil.closeConnection(conn,null,null);
System.out.println("资源关闭");
}
}
public int update(Connection conn, String sql, Object... args){
PreparedStatement ps = null;
try{
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1,args[i]);
}
return ps.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
ConnectUtil.closeConnection(null,ps,null);
}
return 0;
}
}
三、数据库的并发问题
package com.ruqi.prepareStatment;
import org.junit.Test;
import java.sql.Connection;
import java.sql.PreparedStatement;
public class DealShiWu {
@Test
public void updateTest(){
Connection conn = null;
try{
conn = ConnectUtil.getConnection();
conn.setAutoCommit(false);
// 设置隔离级别,通常使用“读取已提交数据”的级别,避免读取脏数据
conn.setTransactionIsolation(Connection.TRANSACTION_READ_COMMITTED);
conn.commit();
System.out.println("事务处理成功");
}catch (Exception exception){
exception.printStackTrace();
try{
conn.rollback();
}catch (Exception e){
e.printStackTrace();
}
}finally {
try {
// 针对连接池可能使用到同个连接,因此需要重新将连接设置会自动提交,避免影响其他操作
conn.setAutoCommit(true);
}catch (Exception e){
e.printStackTrace();
}
ConnectUtil.closeConnection(conn,null,null);
System.out.println("资源关闭");
}
}
public int update(Connection conn, String sql, Object... args){
PreparedStatement ps = null;
try{
ps = conn.prepareStatement(sql);
for (int i = 0; i < args.length; i++) {
ps.setObject(i+1,args[i]);
}
return ps.executeUpdate();
}catch (Exception e){
e.printStackTrace();
}finally {
ConnectUtil.closeConnection(null,ps,null);
}
return 0;
}
}
2、隔离级别,越往下并发性越差,一致越好,通过取中间两种即可满足日常情况
3、mysql设置隔离级别