• mysql 事务 隔离性 锁


    1、四大特性

      1.1 原子性(Atomicity) 

        一个事务是不可分割的最小工作单位。一个事务是不可分割的最小工作单位。

        利用undo log保证原子性,undo log记录的是操作的反向语句,例如执行的insert语句,则undo log记录的是delete语句。

      1.2 一致性(Consistency):

        事务执行前后的数据,必须保持一致。

        利用redo log保证持久性,需要注意redo log和binlog的一致性。为了保证一致性,mysql的内部存在XA事务,俗称日志的两阶段提交协议。

          redo log 记录的是数据的物理变化,所以叫物理日志,当我们修改数据的时候,写完内存了,但数据还没真正写到磁盘的时候。此时我们的数据库挂了,我们可以根据redo log来对数据进行恢复!

          binlog 记录的是数据的逻辑变化,所以又叫逻辑日志,statement模式下记载的是update/delete/insert这样的SQL语句,主要用来主从复制和恢复数据用

          XA事务:将事务提交分为了两个阶段,prepare阶段和commit阶段

            prepare:写入redo log,并将回滚段置为prepared状态,此时binlog不做操作

            commit:innodb释放锁,释放回滚段,设置提交状态,写入binlog,然后存储引擎层提交。

          mysql数据库崩溃恢复:

            崩溃恢复时,扫描最后一个Binlog文件,提取其中的xid;

            InnoDB维持了状态为Prepare的事务链表,将这些事务的xid和binlog中记录的xid做比较,如果在binlog中存在,则提交,否则回滚事务。

      1.3 隔离性(Isolation):

        多个事务之间数据要相互隔离,即彼此独立和透明互不影响。

        利用锁和MVCC机制保证隔离性

        隔离级别分为:读未提交、读已提交、可重复读、串行化

        四种隔离级别主要是为了解决:脏读、不可重复读、幻读等情况

        详细说明见 4

      1.4 持久性(Durability):

        事务一旦被提交(commit / rollback ),数据的改变是永久性的。

    2、大事务

      执行时间很长的事务,会造成大量的阻塞和锁超时,容易造成主从延迟,回滚费劲等

      监控:监控表 information_schema.Innodb_trx ,设置长时间阈值,超过了报警或者kill

    select * from information_schema.innodb_trx where TIME_TO_SEC(timediff(now(),trx_started))>60;

    3、数据库宕机重启,事务丢失

      主要sync_binlog配置(控制binlog刷盘时机)和innodb_flush_log_at_trx_commit配置(配置redolog刷盘时机)

      默认innodb_flush_log_at_trx_commit=1 sync_binlog=0 :每次事务提交时都将 redo log 直接持久化到磁盘.但是MySQL不控制binlog的刷新,由操作系统自己控制它的缓存的刷新

    4、隔离性

      隔离级别:读未提交、读已提交、可重复读、串行化

      解决问题:脏读、不可重复读、幻读

      名词解释

        脏读:某个事务执行时,读到了其他事务还没commit的数据,其他事务进行了回滚操作,就造成了脏读,也就是读到了脏数据

        不可重复读:某事务执行时,事务执行过程中任意两个时间点读取同一数据时结果不同,原因是读取某一个数据后,其他事务进行了update、commit操作,此时再读数据就出现了内容不一致情况。主要出现在update上

        幻读:a按某个规则读取记录后,b事务执行了insert语句,a再查询的时候就会发现相同规则出来的数据有变化,主要出现在insert上

        读未提交:mysql的最低隔离级别,相当于什么措施都没有

        读已提交:只能读取其他事务提交的数据,解决了脏读,但是不能解决不可重复读,通过“瞬间共享读锁”和“排他写锁”实现, 即事物需要对某些数据进行修改必须对这些数据加 X 锁,读数据时需要加上 S 锁,当数据读取完成后立刻释放 S 锁,不用等到事物结束。

        可重复读:mysql的默认隔离级别,通过“共享读锁”和“排他写锁”实现,即事物需要对某些数据进行修改必须对这些数据加 X 锁,读数据时需要加上 S 锁,当数据读取完成并不立刻释放 S 锁,而是等到事物结束后再释放。

        串行化:最高级别的隔离,所有的事务顺序执行,隔离效果最好,性能最差

      读已提交和可重复读分别是用行锁、间隙锁和MVCC机制实现的。

    5、锁

      只有在inner DB下才会存在锁的概念

      范围锁

        表锁:直接锁定一个表、其余所有对表的操作都被阻塞,一般用在DDL处理时(insert,alter、drop)

        行锁:冻结一行或者几行,比如where name ='张三',则锁定所有name=张三的行

      其他锁

        共享锁:S锁,加了S锁之后可以允许其他事务读该记录

        排他锁:X锁,加了X锁之后不允许其他事务读该记录

        记录锁:仅锁定单挑索引记录的数据

        间隙锁:冻结一个索引区间,比如where id in (1,4,6,8),那么会冻结1-4行 5-8行两个区间,左开右闭

        意向锁:可以与表锁或者行锁共用,比如某事务给某一行加了一个排他锁,会同时给表添加一个意向锁,那么事务2读该表时就可以不用每条记录的判断是否有锁,而是可以直接通过意向锁知道锁的位置。

          

      

  • 相关阅读:
    setTimeout()和setInterval() 何时被调用执行
    Linux下常用SVN命令
    IE6/7/8兼容问题、时间对象返回NAN
    BX2001: IE 支持使用 window.clipboardData 访问系统剪贴板,Chrome 和 Safari 中存在类似的 Clipboard 对象但尚未实现,Firefox 和 Opera 不支持这类对象
    IE的layout属性详解
    css expression
    IE6/IE7下绝对定位position:absolute和margin的冲突问题解决
    优雅绝妙的Javascript跨域问题解决方案
    javascript的闭包
    使用X-UA-Compatible来设置IE8/IE9兼容模式
  • 原文地址:https://www.cnblogs.com/xiufengd/p/15936760.html
Copyright © 2020-2023  润新知