数据库事务

一、含义

  通过一组逻辑操作单元(一组DML——sql语句),将数据从一种状态切换到另外一种状态。

二、特点

  (ACID)

  原子性:要么都执行,要么都回滚
  一致性:保证数据的状态操作前和操作后保持一致
  隔离性:多个事务同时操作相同数据库的同一个数据时,一个事务的执行不受另外一个事务的干扰
  持久性:一个事务一旦提交,则数据将持久化到本地,除非其他事务对其进行修改

 

三、相关步骤

  1、开启事务

  2、编写事务的一组逻辑操作单元(多条sql语句)

  3、提交事务或者回滚事务

  

set autocommit=0;
start transaction;
commit;
rollback;

 

四、事务的分类

  隐式事务,没有明显的开启和结束事务的标志

  比如

    insert 、update、delete语句本身就是一个事务

  

  显式事务,具有明显的开启和结束事务的标志

    1、开启事务

      取消自动提交事务的功能

    2、编写事务的一组逻辑操作单元(多条sql语句)

      insert

      update

      delete

    3、提交事务或者回滚事务

 

五、事务的隔离级别

  事务并发问题如何发生?

    当多个事务同时操作同一个数据库的相同数据时

  事务的并发问题有哪些?

    脏读:一个事务读取到了另外一个事务未提交的数据

      对于两个事物T1,T2.T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时 且无效的。

    不可重复读:同一个事务中,多次读取到的数据不一致

      对于两个事物T1,T2.T1读取了一个字段,然后T2更新了该字段,之后,T1再次读取同一个字段,值就不同了。

    幻读:一个事务读取数据时,另外一个事务进行更新,导致第一个事务读取到了没有更新的数据

      对于两个事物T1,T2.T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行。之后,如果T1再 次读取同一个表 ,就会多出几行。

  如何避免事务的并发问题?

    通过设置事务的隔离级别

      1、READ   UNCOMMITTED

      2、READ   COMMITTED         可以避免脏读

      3、REPEATABLE  READ         可以避免脏读、不可重复读和一部分幻读

      4、SERIALIZABLE                         可以避免脏读、不可重复读和幻读

  设置隔离级别:

    set session|global  transaction isolation level 隔离级别名;

  查看隔离级别:

    select @@tx_isolation;

 

六、回滚点的演示

   演示savepoint的使用

    set autocommit = 0;

    start transaction;

    delete from  account  where id =25;

    savepoint a;  #设置保存点

     delete from  account  where id =29;

    rollback  to  a;  #回滚到保存点

  关键字 

    savepoint 断点

    commit to 断点
    rollback to 断点

 

 

 

 

 

 

 

 

 

posted @ 2021-03-08 20:37  安逸的坐姿  阅读(44)  评论(0编辑  收藏  举报