踩坑记录(事务)

283 阅读5分钟

前言

    第一次进行知识总结,总结可能不会很完整,而且学的也比较基础。希望各位可以进行指点。写这篇文章也是为了让自己在以后回看是发现自己的进步与曾经出现的错误加以改正。


事务总结

  • 事务

事务(Transaction)是数据库中的一组操作。是为了保护数据库执行一系列操作 [1]完整性的措施。当事务中的逻辑操作有一个出现数据问题可以回滚到事务之前。以防止数据库的数据出现问题。

如何使用事务 [2]

  1. 在命令行中使用
  • start transaction;

开启事务

  • commit;

当事务中的一系列操作进行完成,并且数据没有问题时。此操作会在数据库中提交数据,并且保存。

  • rollback;

如果事务中有一个操作造成数据的破环,就可以回滚到开启事务之前。以保护数据的完整性。

  1. 在代码中使用[3]
  • 直接使用代码演示
    //简要的演示一下jdbc的事务操作
    
    //这个文章中不需要太过关心获取的具体细节(比如说其中的变量)
    
    //加载类
    Class.forName(driverClass);
    
    //声明Connection对象
    Connection con = null;
    
   //声明PreparedStatement对象
    PreparedStatement ps = null;
    try{
        //实例化Connection对象
        con=DriverManager.getConnection(url, user, password);
        
        //打开事务
        //事务默认是false的所以需要下列代码手动打开
         con.setAutoCommit(true);
        
        //该操作是给PreparedStatement对象实例化,并且给一个String对象的sql语句
        ps=con.prepareStatement(sql);
        
        //执行ps中的sql语句
        //因为在事务中执行,所以数据库中暂时还并没有改变
        ps.executeUpdate();
        
        //执行下列语句会将事务中的改变提交到数据库
        con.commit();
        
        
        
    }catch(Exception e){
        //当程序出现错误时为了防止出现数据的破环可以在这里使用回滚代码
        con.rollback();
        
    }finally{
        //释放掉jdbc的对象  这里就不进行演示了
    }
    
  • 具体的事务代码
  1. setAutoCommit(boolean );

当类型为true打开事务,默认为false,此时会自动提交哦数据

  1. commit()

提交数据

  1. rollback()

回滚数据

事务的特性

  四大特性(ACID)

  1. 原子性(Atomicity)

事务中的逻辑不是全部完成,就是全部失败。每个事务不可分割。 2.一致性(Consistency) 逻辑执行前后,数据的完整性不变。

  1. 隔离性(Isolation)

多个事务并发时,防止事务相互更改造成数据的不一致

事务隔离有四种级别从低到高分别是: READ COMMITTED < READ UNCOMMITTED < REPEATABLE READ < SERIALIZABLE

  1. 持久性(durability)

事务的数据修改提交后是永久的。

安全问题 (并行打开多个事务时出现的问题)

  1. 脏读

一个事务可以读取另一个未进行提交事务更改的数据。

  1. 不可重复读

一个事务因另一个事务提交数据而造成数据读取不一致。(本事务收到另一个事务的影响)

  1. 幻读

一个事务因另外一个事务插入一个数据而造成的数据与原先不一致。

丢失更新

事务A与事务B同时修改同一行数据时会造成首先更新的数据丢失

- 

隔离级别与解决措施

  1. 设置隔离级别:
    //命令行
    //查看当前会话的隔离级别(mysql默认为REPEATABLE READ)
    select @@transaction_isolation;
    //老版的mysql可能是select @@tx_isolation
    
    
    set sesstion transaction isolation level ______
    //__可以设置为read uncommitted或read committed, repeatable rean或Serializable
  1. 隔离级别说明(后一个级别解决了前一个级别的问题)

    • read uncommitted 读取未提交

      并行事务A,B。当事务B更改数据时(未提交),事务A可以查询事务B更改的数据 (造成了脏读的现象)

    • read committed 读取已提交。

      并行事务A,B。当事务B更改事务并且提交后。事务A可以查询到事务B更改的数据。(造成了不可重复度的现象)

    • repeatable read 重复读

      并行事务A,B。当事务B插入事务并且提交后。事务A可以查询到事务B插入的内容。(造成了幻读现象)

    • serializable 串行化

      会执行最早执行事务的会话。当后一个会话执行事务的逻辑操作是会先阻塞。等待最早进入事务的逻辑提交或回滚后再进行。效率是四种级别最差的。但安全问题方面是最好的。

    注解[4]

  2. 丢失更新的解决方案

    • 乐观锁

    总是设想最好的情况(不会有人同时更新一组数据)。但在更新数据的时候会判断该事务是否被别的事务更新。

    • 悲观锁

    总是设想最坏的情况(事务会被他人修改),所以每次都只能有一个事物线程执行,当另一事务执行的时候阻塞。直到前一个事务完全提交。


  1. 我现在所理解的一系列操作主要是(CRUD)的错误。造成了数据的紊乱。 ↩︎

  2. 因为只学到了mysql的事务所以就以mysql来进行操作 ↩︎

  3. 本人学的是java方向的所以代码是java的代码 ↩︎

  4. 这四种级别的效率从上到下依次减弱。但安全性从上到下依次增强。serializable虽然安全性更高。但是性能的的问题也同要重要。所以serializable很少使用。 ↩︎