前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >mysql系列——事务(Transaction)详解

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

作者头像
solve
发布2019-10-30 13:24:58
5690
发布2019-10-30 13:24:58
举报
文章被收录于专栏:大数据技术栈大数据技术栈

什么是事务

  • 简单来说就是:做一件事件必须有有头有尾,一旦开始,只有两种结果,要么失败,要么成功,而不能出现成功了部分失败了部分。
  • 专业点说就是:一个事务必须具备 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 四大原则琢磨琢磨,加深一下理解,关于事务的更多更深的研究,那就需要在读的你自己去慢慢耕耘咯。。。嘿嘿 !!!最后希望本文对你还是有一点帮助的!!!
本文参与 腾讯云自媒体分享计划,分享自作者个人站点/博客。
原始发表:2018.11.06 ,如有侵权请联系 cloudcommunity@tencent.com 删除

本文分享自 作者个人站点/博客 前往查看

如有侵权,请联系 cloudcommunity@tencent.com 删除。

本文参与 腾讯云自媒体分享计划  ,欢迎热爱写作的你一起参与!

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 什么是事务
  • 为什么要事务
  • 支持事务的引擎
  • 事务的使用
  • 实例
相关产品与服务
云数据库 SQL Server
腾讯云数据库 SQL Server (TencentDB for SQL Server)是业界最常用的商用数据库之一,对基于 Windows 架构的应用程序具有完美的支持。TencentDB for SQL Server 拥有微软正版授权,可持续为用户提供最新的功能,避免未授权使用软件的风险。具有即开即用、稳定可靠、安全运行、弹性扩缩等特点。
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档