mysql进阶笔记

事务


 

事务的四大特性:原子性、一致性、隔离性、持久性

事务隔离级别:(隔离级别越高,并行性能依次降低,安全性依次提高),mysql InnoDB引擎默认隔离级别是可重复读

  • 读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。
  • 读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。
  • 可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。
  • 串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

 可重复读中的版本快照(务视图):InnoDB 里面每个事务有一个唯一的事务 ID,叫作 transaction id。它是在事务开始的时候向 InnoDB 的事务系统申请的,是按申请顺序严格递增的。

而每行数据也都是有多个版本的。每次事务更新数据的时候,都会生成一个新的数据版本,并且把 transaction id 赋值给这个数据版本的事务 ID,记为 row trx_id。

同时,旧的数据版本要保留,并且在新的数据版本中,能够有信息可以直接拿到它。

对于一个事务视图来说,除了自己的更新总是可见以外,有三种情况:
   1 版本未提交,不可见;
   2 版本已提交,但是是在视图创建后提交的,不可见;
   3 版本已提交,而且是在视图创建前提交的,可见。

 读已提交:事务启动之后,事务内的查询语句获取到的数据是已经提交的最新数据,可能造成幻读,也就是多次读取到的可能不一致。

 可重复读:查询会获取在事务启动前就已经提交完成的数据,不过更新的时候会先获取最新的数据版本号,然后再更新,避免丢失其他事务已经提交的数据,并且更新完成之后,

自己成为最新的版本号,所以更新语句之后的查询的数据是更新语句执行完的数据,也就是最新的数据。

 

索引


 

mysql进阶笔记

上一篇:Python连接不上SQL Server的两种根治思路


下一篇:.user.ini和.htaccess