🌳事务概念
数据库事务就是一种SQL语句执行的缓存机制,不会单条执行完毕就更新数据库数据,最终根据缓存内的多条语句执行结果统一判定!
- 一个事务内所有语句都成功即事务成功,接着可以触发commit提交事务来结束事务,更新数据。
- 一个事务内任意一条语句失败即事务失败,接着可以触发rollback回滚结束事务。
- 例:转账业务、批量删除/添加
🌳事务的特性
- 原子性:事务是一个不可分割的工作单位
- 一致性:数据库从一个一致状态转到另一个一致状态,不会破坏数据的完整性
- 隔离性:一个事务的执行不能被其他事务干扰
- 持久性:事务一旦被提交,它对数据库的改变就是持久性的
🌳SQL开启事务的方式
针对自动提交:关闭自动提交即可,多条语句添加以后,最终手动提交或者回滚
SET autocommit = off;//关闭当前连接自动事务的提交方式
sql
sql
#手动提交或者回滚(结束当前事务)
commit/rollback;
//呼应JDBC技术
try{
connect.setAutoCommit(false);//关闭自动提交
//数据库操作
connect.commit();
}catch(Exception e){
connect.rollback();
}
注意:
-
一个事务的最基本要求,必须是同一个连接对象connection
-
事务添加是在业务方法中
-
利用try catch代码块,开始事务、提交事务或者回滚事务
-
将connection传入dao层即可,dao只负责使用,不负责close
🌳BankDao.java
package com.atguigu.api.transaction;
import java.sql.Connection;
import java.sql.DriverManager;
import java.sql.PreparedStatement;
import java.sql.SQLException;
public class BankDao {
public void add(String account, int money,Connection connection) throws ClassNotFoundException, SQLException {
String sql = "update t_bank set money = money + ? where account = ?;";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, money);
statement.setString(2, account);
statement.executeUpdate();
statement.close();
System.out.println("加钱成功!");
}
public void sub(String account, int money,Connection connection) throws ClassNotFoundException, SQLException {
String sql = "update t_bank set money = money - ? where account = ?;";
PreparedStatement statement = connection.prepareStatement(sql);
statement.setInt(1, money);
statement.setString(2, account);
statement.executeUpdate();
statement.close();
System.out.println("减钱成功!");
}
}
🌳BankService.java
package com.atguigu.api.transaction;
import org.junit.Test;
import java.sql.Connection;
import java.sql.DriverManager;
public class BankService {
public void transfer(String addAccount, String subAccount, int money) throws Exception {
BankDao dao = new BankDao();
Class.forName("com.mysql.cj.jdbc.Driver");
Connection connection = DriverManager.getConnection("jdbc:mysql://localhost:3306/book?user=root&password=123456");
try {
connection.setAutoCommit(false);
dao.add(addAccount, money,connection);
System.out.println("------------------------");
dao.sub(subAccount, money,connection);
connection.commit();
} catch (Exception e) {
connection.rollback();
throw e;
}finally {
connection.close();
}
}
@Test
public void start() throws Exception {
transfer("haha","lala",500);
}
}