构建mysql知识网络--事务隔离

92 阅读2分钟

    1、myisam 执行引擎是不支持事务的

    2、事务特性:ACID   (Atomicity、Consistency、Isolation、Durability,即原子性、一致性、隔离性、持久性)

    3、innodb隔离级别

        读未提交是指,一个事务还没提交时,它做的变更就能被别的事务看到。

        读提交是指,一个事务提交之后,它做的变更才会被其他事务看到。

        可重复读是指,一个事务执行过程中看到的数据,总是跟这个事务在启动时看到的数据是一致的。当然在可重复读隔离级别下,未提交变更对其他事务也是不可见的。

        串行化,顾名思义是对于同一行记录,“写”会加“写锁”,“读”会加“读锁”。当出现读写锁冲突的时候,后访问的事务必须等前一个事务执行完成,才能继续执行。

    4、视图

        1、读未提交不创建视图

        2、读提交在sql开始执行的时候创建

        3、可重复读在事务启动的时候创建的

    5、可重复读的场景:在月底做数据校对的时候, 上个月的余额和月末余额的差值是否与上个月明细一致的问题

    6、事务隔离级别的实现

        1、 实际上每条记录在更新的时候都会同时记录一条回滚操作  undolog 。记录上的最新值,通过回滚操作,都可以得到前一个状态的值。

        2、回滚日志什么时候需要删除?答:当系统里面没有比这个回滚日志更早的读视图的时候,也就是说没有谁能驱动他来回滚,就可以删除

    7、 数据库的多版本并发控制(MVCC)

    8、尽量避免使用长事务:可以访问到数据库的很多数据,所以在提交事务的时候,所有的回滚记录都必须保留,导致无法删除,占用过多存储空间,除此之外还会占用锁资源

    9、事务的启动方式

         1、显式启动事务语句, begin 或 start transaction。配套的提交语句是 commit,回滚语句是 rollback。

         2、set autocommit=0,这个命令会将这个线程的自动提交关掉。意味着如果你只执行一个 select 语句,这个事务就启动了,而且并不会自动提交。这个事务持续存在直到你主动执行 commit 或 rollback 语句,或者断开连接。