什么是事务

  • 事务指的是逻辑上的一组操作,组成这组操作的各个单元要么全部成功,要么全部失败
  • 事务的作用:保证在一个事务中多次操作要么全部成功,要么全部失败


mysql事务操作:**

  • start transaction - 手动开启事务
  • commit - 手动提交事务
  • rollback - 手动回滚事务

JDBC事务操作:

  • conn.setAutoCommit(false) - 开启事务
  • conn.commit() - 提交事务
  • conn.rollback() - 回滚事务

事务的简单使用

jdbc中事务管理是通过一个接口 - Connection操作事务处理
过程:

  1. 将自动提交事务改成false - 取消数据库中的自动提交
  2. 事务处理
  3. 如果操作成功就提交事务,如果失败就事务回滚

    1. //事务管理的模板
    2. public void demo1() throws SQLException {
    3. Connection conn = null;
    4. try{
    5. //1.获取连接
    6. conn = C3P0Utils.getConnection();
    7. //2.开启事务管理 - 因为mysql数据库中时自动提交事务的,所以设置为false
    8. conn.setAutoCommit(false);
    9. //处理逻辑代码
    10. //3.手动提交事务
    11. conn.commit();
    12. }catch(Exception e){
    13. e.printStackTrace();
    14. //4.如果处理失败就回滚 - 将前面的操作回滚到原点
    15. try{
    16. conn.rollback();
    17. }catch (Exception e1){
    18. e1.printStackTrace();
    19. }
    20. }finally{
    21. //5.释放资源
    22. if(conn!=null){
    23. conn.close();
    24. }
    25. }
    26. }

    ```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的默认隔离级别
  • 串行化

安全性从上到下越来越高,效率越来越低。