聊聊 mysql 事务?(一)

一、什么是事务

        事务 transaction 是一个抽象的概念,其实就是一组操作集合。mysql 不是所有存储引擎都支持事务,只有 InnoDB 和 NDB 支持(下文忽略)。

  • 自动提交

        InnoDB默认开启自动提交事务,我们可以通过下列语句查看:

SHOW VARIABLES LIKE 'autocommit';

   ​

        自动提交的默认值为ON,就是说默认情况下,如果不显示声明开启事务,那么每次执行SQL语句都算一次事务,MYSQL帮我们自动提交了。比如下面2条语句,算2次事务:

UPDATE ... SET field=XXX WHERE ..
DELETE ... FROM ... WHERE ...

        我们可以通过下列语句显式开启事务:

-- 第一种:
START TRANSACTION

-- 第二种:WORK 可省略
BEGIN [WORK]

        两种语句的效果一致,只不过START TRANSACTION可以加限定条件,有兴趣的自行查下资料。开启显式事务后,在本次事务提交或者回滚前会暂时关闭自动提交的功能。

-- 回滚到事务开始前或回滚到事务保存点
ROLLBACK [WORK] TO [SAVAPOINT]

-- 提交事务
COMMIT;

        需要特别注意隐式提交,即某些语句会导致之前的事务悄悄提交掉,就像输入了COMMIT语句一样,这显然不是我们希望的。大家可以查下资料,网上有很多。
 

二、事务的特性

我们希望事务具有下列特性:

  • 原子性(Acid):要么都成功,要么都失败,并且失败后要回滚到原始状态。
  • 隔离性(Isoland):多个事务之间的状态转换互不影响。
  • 一致性(Consistency):指的是数据库中的数据符合现实世界的约束规则,比如现实世界中,人的体重不可能为负数,假设数据库中体重的字段为weight,那么如果weight>0,那么我们可以说这个数据是符合一致性的,数据库能为我们解决一部分一致性,比如UNIQUE,可以帮我们做唯一性限制,但是更多情况下一致性规则由程序员控制。
  • 持久性(Durability):指事务执行成功后,结果永久保留。

三、事务的状态

根据事务执行的不同阶段,可以大致划分为下列几种状态

  • 活动的 active :事务正在执行中时。
  • 预提交的 precommit:事务二阶段提交的第一阶段时,此时事务未真正执行成功。
  • 提交的 commit:事务提交成功,刷新到磁盘后。 
  • 失败的 fail:事务因错误或手动停止。
  • 中止的 abort:事务回滚后。
  • 1
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值