专栏首页大数据技术栈mysql系列——事务(Transaction)详解

mysql系列——事务(Transaction)详解

什么是事务

  • 简单来说就是:做一件事件必须有有头有尾,一旦开始,只有两种结果,要么失败,要么成功,而不能出现成功了部分失败了部分。
  • 专业点说就是:一个事务必须具备 ACID属性,所谓得 ACID即:  1. Atomicity--原子性:  事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。  2. Consistency--一致性  事务进行过后和执行前,所有数据都是预期一致的(一致性的理解有很多,大概是这样子的)  3. Isolation--隔离性  并发得事务之间不会互相影响,  4. Durability--持久性  一个事务成功了,那么他的的改变应该是永久性的。

为什么要事务

这个其实用脚趾头想想也知道它的重要性,举个简单的例子: 一个用户提交了一个订单,那么这条数据包含了两个信息,用户信息 和购买的 商品信息,我需要把他们分别存到 用户表 和 商品表,如果不采用事务,可能会出现,商品信息插入成功,而用户信息没有,这时候就会出现无主商品了,用户付了钱,却得不到商品,这就尴尬了,而如果采用事务,就可以保证,用户信息 和 商品信息 都必须插入成功,该次事务才算成功,那就不会出现这种问题了

支持事务的引擎

有时候事务并不一定是必须的,为了提升查询效率,有些mysql引擎是不支持事务的,比如 MyISAM,当然目前新版(好像是5.6以后)默认的引擎是 innoDB 是支持事务的,一般为了提升mysql速度,也会做读写分离,因为事务一般是针对写来说的。

事务的使用

我们主要从以下几个术语开始:

  • 事务(transaction)执行一组SQL语句; start transaction即可开始一个事务
  • 回退(rollback)撤销指定SQL语句的过程; rollback即可回退一个事务:rollback 必须是在一个事务里面才能使用,没有事务,就不能谈回退
  • 提交(commit)将未存储的SQL语句结果写入数据库表; commit使用 commit 来结束一个事务的处理:一般使用事务,我们需要自己手动提交,mysql 默认是自动提交的,所以我们需要设置set autocommit = 0来更改提交模式。其中值得注意的是 rollback也会触发提交事务
  • 保留点(savepoint)指事务处理中设置的临时占位符(placeholder),然后你就可以回退到该点。 savepoint s1生成一个保留点,然后可以通过 rollback to s1来回退到 s1 这个保留点

实例

讲了这么多,不来一个实例操作一下,实在是不舒心。。。。下面你可以打开你的mysql 库,按照下面步骤来操作一下,加深下理解:

  • truncate info: 先清除一下表,记得用测试表噢,数据没了可别赖我
  • select * from info: 查询一下,这里表应该是空的了
  • start transaction: 开启一个事务,正式我们的测试
  • insert into info values(1,"s1 before",20181019): 插入一条数据 “s1 before”
  • savepoint s1: 创建一个保留点
  • insert into info values(1,"s1 after",20181019): 再插入一条数据 “s1 after”
  • select * from info: 查询看一下数据,此时应该是可以看到我们上面插入的两条数据。但是你要知道,这两条数据是没有正式入库的,他们只存在你的这个session里面,因为我们的事务还没提交呢。。。不信?你重开一个客户端,查看一下这个表,还是空的噢。
  • rollback to s1: 回滚到 s1 保留点。
  • select * from info: 这个时候你应该是只能看到 “s1 after” 这条数据了,并且事务没有提交,验证的话,还是重启一个客户端查看就好
  • rollback: 回滚事务,也就是说,我们之前做的操作我都不要了,回滚到开始事务时候的状态,并结束事务。
  • insert into info values(1,"no transaction",20181019): 再插入一条数据
  • select * from info: 再另外一个客户端直接查询,立马看到上面插入的数据 “no transaction”,也是验证了事务确实结束了
  • set autocommit=0: 上面我们插入数据,另外一个客户端立马就查询到了,说明是自动提交了我们的插入,现在我们设置不自动提交。
  • insert into info values(1,"autocommit=0",20181019): 插入一条数据 “autocommit=0”
  • select * from info; 在另外一个客户端查询,你会发现,上面这条 "autocommit=0" 数据并没有插入
  • commit 提交,这个时候你再去查询,才能查到你提交的数据 "autocommit=0"

这里需要注意的是,不要将非自动提交和事务搞混淆了,非自动提交,一般是为了批次提交从而提升效率,但是并不具备事务性,而事务是在批次提交的基础上保证了事务性,所以还是有一定区别的噢

  1. 后言: 做完最后的实操,最好再对照下 事务的 ACID 四大原则琢磨琢磨,加深一下理解,关于事务的更多更深的研究,那就需要在读的你自己去慢慢耕耘咯。。。嘿嘿 !!!最后希望本文对你还是有一点帮助的!!!

本文参与腾讯云自媒体分享计划,欢迎正在阅读的你也加入,一起分享。

我来说两句

0 条评论
登录 后参与评论

相关文章

  • Spark系列——Spark On Yarn 资源申请流程

    到这里我们也基本讲明白了 Yarn-Client 模式的资源申请了, 但是说的比较浅,没有涉及到很多细节, 说来也比较惭愧,Spark 的 Standalo...

    solve
  • git 换行符LF与CRLF转换问题

    在各操作系统下,文本文件所使用的换行符是不一样的。UNIX/Linux 使用的是 0x0A(LF),早期的 Mac OS 使用的是0x0D(CR),后来的 OS...

    solve
  • Spark性能优化指南——高级篇

    原文:https://tech.meituan.com/spark-tuning-pro.html

    solve
  • 面试完腾讯,总结了这12道Zookeeper面试题!

    ZooKeeper 是一个开源的分布式协调服务,可以基于 ZooKeeper 实现诸如:数据发布/订阅、负载均衡、命名服务、分布式协调/通知、集群管理、Mast...

    程序员追风
  • 总结了腾讯的 12 道 Zookeeper 面试题

    原文链接:https://www.xttblog.com

    业余草
  • 总结了12道Zookeeper面试题

    ZooKeeper 是一个开源的分布式协调服务,属于面试的热门考点。发现一篇很不错的文章,给大家参考。

    良月柒
  • Mysql锁机制分析【面试+工作】

    数据库锁定机制简单来说就是数据库为了保证数据的一致性而使各种共享资源在被并发访问访问变得有序所设计的一种规则;对于任何一种数据库来说都需要有相应的锁定机制,My...

    Java帮帮
  • 机器学习(13)之最大熵模型详解

    关键字全网搜索最新排名 【机器学习算法】:排名第一 【机器学习】:排名第二 【Python】:排名第三 【算法】:排名第四 前言 最大熵模型(maximum ...

    昱良
  • 观点:疫情结束将是中国新经济企业级SaaS高速发展的开始

    在政府从上到下强有力的疫情防控措施的努力下,全国很多地方的新增病例已经连续几天是个位数甚至是0,疫情防疫战有望很快取得胜利,我们的生活、工作也会在未来一到两个月...

    人称T客
  • “仿OpenStack开发云计算管理软件”第一周实验报告

    熟悉了git提交等基本命令、了解了用于创建独立的 Python 开发环境的Virtualenv,虽然初窥了Flask框架,但仍需要学习实验楼的Flask框架基础...

    汐楓

扫码关注云+社区

领取腾讯云代金券