数据库事务

时间:2020-05-22 11:16:32   收藏:0   阅读:49

什么是事务:

  数据库事务:是指作为单个逻辑工作单元执行的一系列操作,要么完全执行,要么完全不执行。

  通俗理解:事务就是将一堆SQL(通常是增删改操作)的执行绑在一起,要么都执行成功,要么都执行失败,即都执行成功才算成功,否则就会恢复到这堆SQL执行之前的状态。

事务的4大特性:

  原子性:事务中所有操作都是不可分割的原子单位。事务所有操作要么全部执行要么全不执行。

  一致性:事务执行后,数据库状态与其他业务规则保持一致。比如转账,无论成功与否,两账户的总金额是不变的。

  隔离性:就是指在多个操作时(并发操作),不同的事务之间应该隔离开来,使每一个事务互不干扰。比如从其中一个事务查看另一个事务时,另一个事务查询的结果要么是执行前的,要么是执行后的,不会查询到中间的状态数据。

  持久性:一旦事务提交后,事务在的所有数据操作都必须被持久化到数据库中,即使数据库马上崩溃,在重启时也必须保证通过某种机制恢复数据。

MySQL中的事务:

  在默认情况下,MySQL每执行一条sql语句就是一个单独的事务,如果需要一个事务中执行多条sql语句,那么需要开启事务和结束事务。

  开启事务:start transaction;

  结束事务:commit(提交事务)或rollback(回滚事务)。(回滚事务就是回到起点,之前做的所有操作都会失效);

例:

  select * from db;

  start transaction;--开始事务

  .......需要进行的事务sql语句

  commit;--事务提交    或   rollback;--事务回滚    或   quit;--中断操作

 

事务的并发读问题:

  脏读:A事务读取B事务,但事务还未提交,然后事务B开始产生脏读,B事务产生错误执行回滚操作,A读取B中的事务,读取到的数据就是脏读。

  不可重复读:事务A读取了一条数据,然后执行逻辑的时候,被B事务修改了,然后A再去读取,导致两次读取到的数据不匹配。

  幻读(虚读):事务A根据条件查询到了N条数据,然后事务B新增加了符合条件数据,导致A根据条件再去查询的时候,导致查询到的数据比之前的多,就产生了幻读。    (幻读跟不可重复读有些相似)

 

事务的隔离级别:

  read uncommitted (读未提交)安全级别低,可能出现事务并发问题

  read committed (读已提交)(Oracle默认) 防止脏读,没有处理不可重复读,幻读

  repeatable read(可重复读)(mysql默认)防止脏读和不可重复读,不能处理幻读;

  serializable(序列化)(串行化)可以处理脏读,幻读,不可重复读,但是性能最差

 

原文:https://www.cnblogs.com/donghello/p/12935914.html

评论(0
© 2014 bubuko.com 版权所有 - 联系我们:wmxa8@hotmail.com
打开技术之扣,分享程序人生!