事务

事务的特性

  • 一条或多条SQ语句组成一个执行单位,要么全执行,要么全不执行

特点

  • A原子性:一个事务是一个不可分割的整体,要么全部执行,要么都不执行
  • C一致性:一个事务使数据从一个一直状态到另一个一致状态
  • I 隔离性:一个事务的执行不受其他事务的干扰,多个事务之间相互隔离
  • D持久性:一个事务一旦提交,则永久的持续化到本地

分类

  • 隐式事务:没有明显的开始和结束,本身就是一条事务可以自动提交,比如insert、update、delete
  • 显式事务:具有明显的开始和结束

事务的创建

  • 事务提交前
    • set autocommit= 0;
    • start transaction; //可以省略
  • 执行事务语句
    • 语句1;
    • 语句2;
    • 设置回滚点savepoint 回滚点名
    • … …
  • 事务提交或回滚
    • commit 提交
    • rollback 回滚

数据库隔离级别

各种并发问题

  • 脏读:对于两个事务t1、t2,t1读取了已经被t2更新但还没有提交的字段,之后若t2进行回滚,t1读取的内容就是临时无效的
  • 不可重复读:对于两个事务t1、t2,t1读取了一个字段,然后t2更新了该字段之后,t1再次读取时读到的就不是同一个值了
  • 幻读:对于两个事务t1、t2,t1从一个表中读取了一个字段,然后t2在该表中插入/删除了一些新的行,之后如果t1再次读取同一个表,就会多出几行

隔离级别

  • 定义:一个事务与其他事务隔离的程度
  • 常用命令
    • 查看当前隔离级别:SELECT @@tx_isolation;
    • 设置隔离级别:set 【session|global】 transaction isolation level [read uncommit | read commit | repeatable read | serializable];
  • 分类
    • read uncommitted:允许事务读取其他事务未提交的数据,可能出现脏读、幻读、不可重复读
    • read committed:只允许事务读取已经提交的变更,可以避免脏读,可能会发生不可重复读和幻读
    • repeatable read:确保事务可以多次从一个字段中读取相同的值,在这个事务持续期间,禁止其他事务对这个字段进行更新,可以避免脏读和不可重复读,但是可能出现幻读(MySQL中默认的隔离级别)
    • serializable:确保事务可以从一个表读取相同的行,在这个事务持续期间,禁止其他事务对该表执行增删改操作,所有并发问题都可以避免,但是性能十分低下
  • 隔离级别和对应并发问题
事务隔离基本脏读不可重复读幻读
read uncommitted
read committed
repeated read
serializable

delete和truncate在事务使用时的区别

  • delete:支持回滚
  • truncate:不支持回滚

版权声明:本文为double_happiness原创文章,遵循CC 4.0 BY-SA版权协议,转载请附上原文出处链接和本声明。