transaction (2)—mysql进阶(五十八)

本文涉及的产品
云数据库 RDS MySQL,集群系列 2核4GB
推荐场景:
搭建个人博客
RDS MySQL Serverless 基础系列,0.5-2RCU 50GB
RDS MySQL Serverless 高可用系列,价值2615元额度,1个月
简介: transaction (2)—mysql进阶(五十八)

上篇文章说了acid四个事务的特性,原子性保证要不两个sql一起执行,要么不执行,隔离性,两个事务之间必须互不干扰,一致性,两边的数据必须保持一致,可以说一致性的前提是原子性和隔离性必须正常,但原子性和隔离性都正常,就能保证一致性吗?并不是,还必须满足其他一些约束,比如金额不能为负数。持久性就是必须持久化到磁盘才算事务成功。

transaction (1)—mysql进阶(五十七)


Mysql中事务语法


前面我们重点介绍了理论知识,那么我们在mysql里如何使用呢?


开启事务


我们可以用命令开启事务:

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> START TRANSACTION;
Query OK, 0 rows affected (0.00 sec)

Begin开启事务或者start transaction开启事务。

不过start transaction 语句后面可以跟随几个修饰符,就是他们几个,

Read only:表示当前事务是只能读取数据,不能修改数据。(如果我们使用create temporary table创建的临时表,由于他们在当前会话可见,所以在只读事务里,也可以对临时表增,删,改)

Read write:表示当前事务是一个读写事务,也可以修改表。

With consistent snapshot :启动一致性读。

//开启一个事务

START TRANSACTION READ ONLY;

//开启多个事务

START TRANSACTION READ ONLY, WITH CONSISTENT SNAPSHOT;

注意:一个事务不能同时设置只读和读写,这样就有冲突了,另外,如果我们没有显式指定开启什么访问模式,那么默认就是读写访问模式。


提交事务

mysql> BEGIN;
Query OK, 0 rows affected (0.00 sec)
mysql> UPDATE account SET balance = balance - 10 WHERE id = 1;
Query OK, 1 row affected (0.02 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> UPDATE account SET balance = balance + 10 WHERE id = 2;
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings:
mysql> COMMIT;
Query OK, 0 rows affected (0.00 sec)

一个完整的事务过程,开启之后,必须commit之后,才会刷新到磁盘。


手动中止事务


如果我们在执行sql的时候,写到一半,发现错了怎么办呢?比如狗给猫转10元,但是写成了转100,这时候我们只要吧上面的commit换成rollback就好。

mysql> ROLLBACK;
Query OK, 0 rows affected (0.00 sec)

值得注意的是,如果在平时开发中,遇到异常,mysql会自动帮我们回滚,这里的回滚是我们自己手动的。


支持事务的存储引擎


我们前面说了,mySIAM是不支持事务的,而支持事务的存储引擎是innoDB,如果开启事务后,mySIAM存储引擎insert into一条数据,然后rollback,这时候 数据不会回滚,查询会查到刚那条数据。但如果是innoDB开启事务后,insert into一条数据,然后rollback,这时候数据会回滚,不会查询到那条数据。


自动提交


Mysql有个系统变量autocommit,

mysql> show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
---------------+-------+
| autocommit    | ON    |
+---------------+-------+
1 row in set (0.00 sec)

这里默认是on,但这个on代表的是每条sql语句有一个独立的事务,这种特性称为事务的自动提交。加入狗给猫转了10元钱,猫加了10元钱,这两个sql语句是在不同的独立事务进行的。

当然如果想关闭这种自动提交,让他们在同一个事务里,可以显式用begin或者start straction启动,或者set autocommit 为off。

这样我们写的sql都在同一个事务里面,直到我们显式commit或者rollback。


隐式提交


前面说过,当我们显式start transaction 和begin ,或者吧系统变量autocommit设置成off,则不会自动提交事务,但如果我们 没有写commit或者rollback,有的语句也会触发提交事务,这些就称为隐式提交。

当我们定义或者修改数据库对象的数据定义语言(DDL):所谓的数据库对象,指的是数据库,表,视图,存储过程等等这些东西,当我们使用create ,alter,drop等语法对这些数据库对象进行操作的时候,就会隐式提交事务。

BEGIN;
SELECT ... # 事务中的一条语句
UPDATE ... # 事务中的一条语句
... # 事务中的其它语句

CREATE TABLE ... # 此语句会隐式的提交前边语句所属于的事务

隐式使用或修改mysql数据库的表

当我们使用alert user,create user,drop user,grant,rename user,revoke,set password等语句也会隐式提交这些内容。

事务控制或关于锁定的语句

当我们事务开没提交,在sql之后,又写了一个start transaction或者begin,会隐式提交前面的sql。

如果吧autocommit 改为on,也会提交事务。

如果有lock tables,unlock tables,也会提交事务。

Mysql复制的语句

使用start slave,stop slave,reset slave,change master to 等语句也会触发提交。

还有很多其他语句也会触发。


保存点


当我们写了一大堆sql,发现其中一个sql写错,然后就rollback,全部恢复,这样总有一夜回到解放前的感觉,怎么解决这个困境呢?

我们可以在sql执行完一段时候,写一个保存点,然后rollback  to 保存点。

mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)
 mysql> update user set uid = '55' where id = '3';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
mysql> savepoint s1;
Query OK, 0 rows affected (0.00 sec)
mysql> update user set uid = '55' where id = '4';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
 mysql> rollback to s1;
Query OK, 0 rows affected (0.00 sec)

大家可以看到,这里就回到了保存点,保存点前面的sql全部都执行了。

RELEASE SAVEPOINT 保存点名称;

相关实践学习
如何快速连接云数据库RDS MySQL
本场景介绍如何通过阿里云数据管理服务DMS快速连接云数据库RDS MySQL,然后进行数据表的CRUD操作。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
5月前
|
存储 SQL 关系型数据库
MySQL语句详解:从基础到进阶的全面指南
MySQL语句详解:从基础到进阶的全面指南
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第三篇(MySQL性能优化)
MySQL数据库进阶第三篇(MySQL性能优化)
|
6月前
|
存储 关系型数据库 MySQL
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
MySQL数据库进阶第六篇(InnoDB引擎架构,事务原理,MVCC)
|
6月前
|
SQL 关系型数据库 MySQL
MySQL数据库进阶第五篇(锁)
MySQL数据库进阶第五篇(锁)
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(2)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
6月前
|
存储 SQL 关系型数据库
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】(1)
MySQL 进阶使用【函数、索引、视图、存储过程、存储函数、触发器】
|
5月前
|
存储 关系型数据库 MySQL
MySQL数据库开发进阶:精通数据库表的创建与管理22
【7月更文挑战第22天】数据库的创建与删除,数据表的创建与管理
53 1
|
6月前
|
JSON 关系型数据库 MySQL
MySQL常用函数解读:从基础到进阶的全方位指南
MySQL常用函数解读:从基础到进阶的全方位指南
|
6月前
|
SQL 关系型数据库 MySQL
Python进阶第二篇(Python与MySQL数据库)
Python进阶第二篇(Python与MySQL数据库)
|
5月前
|
分布式计算 关系型数据库 MySQL
MaxCompute产品使用合集之用flink mysql的数据同步到mc的Transaction Table2.0,时间会比mysql的时间多8小时,是什么导致的
MaxCompute作为一款全面的大数据处理平台,广泛应用于各类大数据分析、数据挖掘、BI及机器学习场景。掌握其核心功能、熟练操作流程、遵循最佳实践,可以帮助用户高效、安全地管理和利用海量数据。以下是一个关于MaxCompute产品使用的合集,涵盖了其核心功能、应用场景、操作流程以及最佳实践等内容。