数据库事务
相关操作
- 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,表中所有的列只与主键直接相关而不是间接相关