什么是事务
- 事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全部失败
- 事务的作用:保证在一个事务中多次操作要么全部成功,要么全部失败
mysql事务操作:**
- start transaction - 手动开启事务
- commit - 手动提交事务
- rollback - 手动回滚事务
JDBC事务操作:
- conn.setAutoCommit(false) - 开启事务
- conn.commit() - 提交事务
- conn.rollback() - 回滚事务
事务的简单使用
jdbc中事务管理是通过一个接口 - Connection操作事务处理
过程:
- 将自动提交事务改成false - 取消数据库中的自动提交
- 事务处理
如果操作成功就提交事务,如果失败就事务回滚
//事务管理的模板public void demo1() throws SQLException {Connection conn = null;try{//1.获取连接conn = C3P0Utils.getConnection();//2.开启事务管理 - 因为mysql数据库中时自动提交事务的,所以设置为falseconn.setAutoCommit(false);//处理逻辑代码//3.手动提交事务conn.commit();}catch(Exception e){e.printStackTrace();//4.如果处理失败就回滚 - 将前面的操作回滚到原点try{conn.rollback();}catch (Exception e1){e1.printStackTrace();}}finally{//5.释放资源if(conn!=null){conn.close();}}}
```java package transaction.demo.ba1;
import org.junit.Test;
import java.sql.Connection; import java.sql.PreparedStatement; import java.sql.SQLException;
/**
演示jdbc中mysql数据库的事务管理 / public class JDBCTransactionDemo1 { //模拟银行转账的功能 @Test public void test() throws SQLException {
Connection conn = null; PreparedStatement ps = null; try{ conn=C3P0Utils.getConnection(); conn.setAutoCommit(false); //开始处理业务逻辑 String sql = "update account set money = ? where name = ?"; ps = conn.prepareStatement(sql); //1汇款 ps.setInt(1,-1000); ps.setString(2,"jack"); ps.executeUpdate(); //停电 int n =1/0; //2收款 ps.setInt(1,1000); ps.setString(2,"rose"); ps.executeUpdate(); //提交事务 conn.commit(); System.out.println("转账成功!"); }catch(Exception e){ e.printStackTrace(); conn.rollback(); System.out.println("转账失败!"); }finally{ if(ps != null) ps.close(); if(conn != null) conn.close(); }} }
```
事务的特性:ACID
- 原子性(Atomicity)原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
- 一致性(Consistency)事务前后数据的完整性必须保持一致。
- 隔离性(Isolaton)事务的隔离性是指多个用户并发访问数据库时,一个用户的事务不能被其他用户的事务所干扰,多个并发事务之间数据要相互隔离。
- 持久性(Durability)持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响。
并发访问问题
脏读:一个事务读到了另一个事务未提交的数据。
不可重复读:一个事务读到了另一个事务已经提交的更改数据。引发另一个事务在多次查询中出现不同结果。
幻读:一个事务读到了另一个事务已经提交的添加数据。导致另一个事务在多次查询中出现结果条数多出的情况。
**
mysql事务的隔离级别
- 读取未提交内容
- 读取已提交内容
- 可重复读 - mysql的默认隔离级别
- 串行化
安全性从上到下越来越高,效率越来越低。
