2019.4.1 事务和隔离级别

数据库事务

相关操作

  • 1.事务开始:开始一个事务,作为回滚的标记
  • 2.回滚(rollback):回滚到上一个事务开始的地方或者回滚到某个存档点 期间所有的没有被commit的操作都会被撤回
  • 3.提交(commit):将事务中所有的操作提交到数据库中
  • 4.存档点:设置存档点方便回滚

事务的四个特性(ACID)

  • 1.原子性(Atomicity)
    • 事务包含的所有操作,要么全部成功,要么全部失败
  • 2.一致性(Consistency)(快照读)
    • 事务必须使数据库从一个一致性状态到另一个一致性状态
  • 3.隔离性(Isolation)
    • 如果有多个用户并发访问数据库,数据库的每一个用户开启的事务不能被其他事务的操作干扰
    • 多个并发事务之间应该保持相互隔离
  • 4.持久性(Durability)
    • 事务的操作一旦被提交,对于数据库的改变是永久的 即时数据库发生故障,也不能丢失已提交的数据

代码

关闭自动提交

set autocommit = false ;

开启事务

start transaction ;

begin ;

存档

savepoint save;

回滚

rollback to save;

提交

commit ;

三个隔离性问题

  • 1.脏读:一个事务读取了未提交事务执行过程中的数据
  • 2.不可重复读:对于数据库中的某个数据 一个事务执行过程中多次查询返回不同结果
  • 3.幻读(虚读):对于一个事务批量修改数据的时候,另外的事务插入一条新的数据,在第一个事务中执行了操作缺没有将所有情况的数据都进行修改

四个隔离级别

  • 1.RU(Read Uncommitted)
    读取未提交内容,所有事务都可以看到其他事务的未提交内容
  • 2.RC(Read Committed)
    读取提交内容,,可以避免脏读 但是无法避免可重复读和幻读
  • 3.RR(Repeatable Read)
    可重复读 MySQL默认的隔离级别 可以避免脏读和可重复读 但是不能避免幻读
    通过Innodb引擎多版本并发控制
  • 4.Serializable 串行化
    最高的隔离级别 强制所有的事务排序执行,性能上会出现问题 会出现大量的超时和锁竞争

隔离级别的实现

  • 1.读锁和写锁
    • 共享锁:数据库的读锁,一旦加上该锁,其他用户只能读不能写
    • 排它锁:写锁 一旦给表或者行加上写锁 其他用户不能读也不能写
  • 2.行锁和表锁

数据库设计三大范式

  • 第一范式---保证列不能拆分
    • 数据库表中的每一字段都是不能继续拆分的最小单元
  • 第二范式---一个表只描述一个事
    • 满足第一范式之后(1NF),表中的每一列都必须依赖主键
  • 第三范式---使用外键做表之间的关联
    • 满足2NF,表中所有的列只与主键直接相关而不是间接相关
原文地址:https://www.cnblogs.com/lzb1234/p/10636919.html