前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结

MySQL数据库——事务的操作(开启、回滚、提交)、特征、隔离级别基础总结

作者头像
Winter_world
发布2020-09-25 10:56:20
18K0
发布2020-09-25 10:56:20
举报

 1 事务的基本概念

如果一个包含多个步骤的业务操作,被事务管理,那么这些操作要么同时成功,要么同时失败。如下A给B转钱的例子很形象的说明了事务的概念:

1.1 事务的操作

  • 开启事务:start transaction;
  • 回滚:rollback;
  • 提交:commit;

【举例】:还是用这个A给B转账的例子,在SQLyog中进行模拟开启事务、回滚、提交

代码语言:javascript
复制
-- 创建表
CREATE TABLE account (
	id INT PRIMARY KEY AUTO_INCREMENT,
	NAME VARCHAR(10),
	balance DOUBLE
);
-- 添加数据
INSERT INTO account (NAME, balance) VALUES ('zhangsan', 1000), ('lisi', 1000);

UPDATE account SET balance = 1000;
SELECT * FROM account;
-- 0. 开启事务
START TRANSACTION;
-- 1. 张三账户 -500
UPDATE account SET balance = balance - 500 WHERE NAME = 'zhangsan';
-- 2. 李四账户 +500
-- 出错了...
UPDATE account SET balance = balance + 500 WHERE NAME = 'lisi';

-- 发现执行没有问题,提交事务
COMMIT;

-- 发现出问题了,回滚事务
ROLLBACK;

1)在A窗口中先开启事务,然后执行张三账户-500,-》出错了-》李四账户+500,此时查询A窗口数据,张三确实-500,但李四还是100;在B窗口中查询数据,张三和李四都是1000,没发生变化;说明A窗口中开启事务起了作用,且A中查询的数据也只是暂时的。

2)发现错误后,执行回滚操作,再次在窗口A和B中查询,数据都是1000,回滚操作成功。

3)在A窗口中先开启事务,然后执行张三账户-500-》李四账户+500,此时查询A窗口数据,张三确实-500,李四+500;在B窗口中查询数据,张三和李四都是1000,没发生变化;因在A窗口中的操作都OK,执行提交事务,再次在窗口A和B中查询,数据都发生正确变化,事务提交成功。

1.2 MySQL数据库的事务提交

1)事务提交的两种方式

  • 自动提交:MySQL数据库默认是自动提交的,一条DML(增删改语句)会自动提交一次事务;
  • 手动提交:需要先开启事务(START TRANSACTION),再提交(COMMIT);                   Oracle数据库默认是手动提交的;

2)修改事务的默认提交方式

  • 查看默认提交方式:SELECT @@autocommit; -- 1代表自动提交,0代表手动提交
  • 修改默认提交方式:SET @@autocommit = 0; -- 1代表自动提交,0代表手动提交

实际上手动控制事务的开启与提交,可以大幅度提高数据插入的效率,在进行数据批量插入操作时可以手动控制事务。

2 事务的四大特征

1)原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败;

2)持久性:事务一旦提交或回滚,数据表的数据将被持久化的保存;

3)隔离性:多个事务之间相互独立;

4)一致性:表示事务操作前后,数据总量不变。

3 事务的隔离级别

多个事务之间是隔离的,相互独立的,但是如果多个事务操作同一批数据,则会引发一些问题,设置不同的隔离级别,就可以解决这些问题。

3.1 存在的问题

1)脏读:一个事务读取到另一个事务中没有提交的数据; 【举例】:A给B发1000块钱,手一抖打了10000,这个钱已经打到B的户口,但是事务还没有提交,这时B查下卡,发现多了9000,兴奋坏了,但是A及时发现,马上回滚差点提交的事务,将数字改回1000再提交。

2)不可重复读(虚读):在同一个事务中两次读取到的数据不一样; 【举例】:A拿着卡去购物,卡里有1000块钱,当A买单时(事务开启),收费系统事先检测到他的卡里有1000,就在这个时候,A的妻子要把钱全部拿出来买首饰,并提交。当收费系统准备扣款时,再检测卡里的金额,发现已经没钱了(第二次检测金额当然要等待A的妻子转出金额事务提交完),A就会很郁闷,钱哪去了。。。

3)幻读:一个事务操作(DML)数据表中所有的记录,另一个事务添加了一条数据,则第一个事务查询不到自己的修改; 【举例】:A去消费,花了1千元,A的妻子去查看他今天的消费记录(全表扫描FTS,妻子事务开启),看到确实是花了1千元,就在这时,A又花了1千元买了一个机械键盘,即新增INSERT了一条消费记录,并提交。当妻子打印消费记录清单时(妻子事务提交),发现花了2千元,似乎出现了幻觉,这就是幻读。

3.2 隔离级别

1)read uncommitted:读未提交      【会产生的问题】:脏读、不可重复读、幻读

2)read committed:读已提交(Oracle默认)     【会产生的问题】:不可重复读、幻读

3)repeatable read:可重复读(MySQL默认)     【会产生的问题】:幻读

4)serializable:串行化     【会产生的问题】:可以解决所有问题

【注意】:隔离级别从小到大,安全性越来越高,但是效率越来越低。但是一般情况下不会修改数据库默认的隔离级别,只有在极特殊情况下才会做出修改已解决一些特殊问题。

数据库查询隔离级别:select  @@tx_isolation;

数据库设置隔离级别:set global transaction isolation level 级别字符串;

———————————————————————————————————————

本文为博主原创文章,转载请注明出处!

本文参与 腾讯云自媒体同步曝光计划,分享自作者个人站点/博客。
原始发表:2020-07-01 ,如有侵权请联系 cloudcommunity@tencent.com 删除

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

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

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

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