mysql事务简记

事务:

  • acid,原子性、隔离性、一致性、持久性

    • 原子性:事务的执行必须是原子的,要么全部执行,要么全部失败。
    • 隔离性:事务之间的操作不能相互干扰
    • 一致性:事务执行前后,数据从一个合法状态转换到另一个合法状态,合法指语义合法。可以理解为并发情况下的存钱取钱
    • 持久性:事务的执行结果是持久在本地计算机的,不存在重启后又回到了事务执行前状态
  • 事务状态:活动,部分提交(事务执行后未刷盘),提交(事务执行后已刷盘),失败(发生错误停止事务),中止(错误后回滚数据)

  • 事务类型:

    • 扁平事务:begin开启commit关闭的最简单最频繁的事务
    • 带有savepoint的扁平事务
    • 链事务:事务由链式子事务结合,commit执行后触发到下一个事务
    • 分布式事务:分布式环境下的扁平事务
    • 嵌套事务:树状结构的嵌套事务
  • 显式提交 start transaction 或 begin

  • 隐式提交 set autocommit 开启

    • 默认情况下autocommit = on时,DML会自动提交
    • DDL对数据库对象操作时,不受autocommit影响隐式提交
    • 隐式使用数据库中的表(权限或者用户)
    • 一个事务未提交又开启一个事务,隐式提交之前的事务
    • autocommit = off 调成 on,隐式提交之前的事务
    • 导入数据语句、mysql复制语句
    • 默认completion为0,commit提交事务则开启下一个事务需要start transaction或begin。
    • completion=1,commit相当于执行了COMMIT AND CHAIN,开启一个链式事务,即提交事务之后会开启一个相同隔离级别的事务。
    • completion=2,COMMIT=COMMIT AND RELEASE,提交后,会自动与服务器断开连接。
  • 数据并发问题:脏写 > 脏读 > 不可重复读 > 幻读

    • 脏写:事务A修改了 未提交事务B修改过的数据,事务Acommit了但是事务B回滚了,则A写入失败。
    • 脏读:读到了未提交的数据。如事务A读取了 已经被事务B更新但还没有提交的字段,若事务B回滚则事务A读取的数据是临时且无效的
    • 不可重复读:同一事务下一条查询语句不同时间执行得到数据不一致。如事务A读取了该字段,事务B更新了该字段,事务A再读取该字段则读到的值不同了
    • 幻读:同一事务下一条查询语句不同时间执行得到数据集不同。事务A从表中读读取了一个字段,事务B在该表中插入(删除不幻读)了新的行,事务A再次读取该表则多读了几行
  • 事务隔离级别:无脏写,无论那种情况都不允许脏写发生。随着隔离级别的增高,并发性能降低,mysql查看命令:select @@transaction_isolation,设置命令set [global | seesion] transaction_isolation = ‘隔离级别’

    • read uncommitted:读未提交,什么问题都解决不了
    • read commited:读已提交,解决了脏读问题
    • repeatable read:可重复读,mysql默认级别,解决脏读和不可重复读,加索引独占锁也可以解决幻读
    • serializable:可串行化,不允许并发,则解决了所有数据并发问题,并发性能十分底下

你可能感兴趣的:(mysql,mysql,数据库)