mysql事务

本文涉及的产品
云数据库 RDS MySQL Serverless,0.5-2RCU 50GB
简介:

 

1、什么是事务?

   事务是作为一个不可分割的逻辑单元而被执行的一组sql语句,要么同时执行成功要么撤销。

 

2、事务的四个特性?(ACID

1、原子性:构成一个事务的所有语句应该是一个独立的逻辑单元,要么全部执行成功,要么一个都不成功。你不能只执行它们当中的一部分。

2、稳定性(一致性):  数据库在事务开始执行之前和事务执行完毕之后都必须是稳定的。换句话说,事务不应该把你的数据库弄得一团糟。

3、隔离性(孤立性):  事务不应该相互影响。

4、可靠性(持久性)如果事务执行成功,它的影响将被永久性地记录到数据里。

    

3使用事务的前提条件是什么呢?表的存储引擎必须是innodb

 

4、使用事务

 

我们先来创建一个银行的转账表,字段为用户id、用户名、钱,这里注意下我们使用的是innodb的存储引擎。

CREATE TABLE `brank`.`bank` (

`userid` INT NOT NULL AUTO_INCREMENT ,

`name` VARCHAR( 20 ) NOT NULL ,

`money` INT NOT NULL ,

PRIMARY KEY ( `userid` ) 

) ENGINE = InnoDB;

 

然后插入两条测试数据:

INSERT INTO `brank`.`bank` (

`userid` ,

`name` ,

`money` 

)

VALUES (

NULL , '张三', '1000'

), (

NULL , '李四', '1'

);


查看结果:

+--------+------+-------+

| userid | name | money |

+--------+------+-------+

|      1 | 张三 |  1000 |

|      2 | 李四 |     1 |

+--------+------+-------+

2 rows in set (0.00 sec)

    

现在我们来实现这个转账的过程,根据上面的分析我们知道这需要两条sql语句来实现。假设我们要实现张三转800元给李四?

  第一:我们要修改张三的记录将money字段的值减去800

  第二:我们要修改李四的记录将 money字段的值增加800

  

在默认的情况下,mysql从自动提交模式运行,这种模式会在每条语句执行完毕后把它作出的修改立刻提交给数据库并使之永久化。事实上,这相当于把每一条语句都隐含地当做一个事务来执行。如果你想明确地执行事务,需要禁用自动提交模式并告诉mysql你想让它在何时提交或回滚有关的修改。

 

执行事务的常用办法是发出一条start transactionbegin语句挂起自动提交模式,然后执行构成本次事务的各条语句,最后用一条commit语句结束事务并把它们作出的修改永久性的记入数据库。万一在事务过程中发生错误,用一条rollback语句撤销事务并把数据库恢复到事务开始之前的状态。

 

1) 现在我们来开始事务:

Mysql>Begin;

      Query OK, 0 rows affected (0.00 sec)

 

执行第一条修改句

Mysql>update bank set money = money -800 where name = ‘张三’;

Query OK, 1 row affected (0.05 sec)

Rows matched: 1  Changed: 1  Warnings: 0

 

执行第二条修改语句

Mysql>update bank et money = money + 800 where name = ‘李四’;

ERROR 1064 (42000): You have an error in your SQL syntax; check the manual that

corresponds to your MySQL server version for the right syntax to use near 'money

 = money + 800 where name = '李四'' at line 1

这个时候语句出错了,想想我们应该怎么办?那我们就让事务回滚一下

 

2) 事务回滚:

Mysql > rollback;

Query OK, 0 rows affected (0.05 sec)

Mysql > select * from bank;

+--------+------+-------+

| userid | name | money |

+--------+------+-------+

|      1 | 张三 |  1000 |

|      2 | 李四 |     1 |

+--------+------+-------+

2 rows in set (0.00 sec)

看到效时了吧,和执行事务之前的数据状态一样。这就是使用事务的好处

 

3) 自动提交模式(mysql默认的提交模式)

Set autocommit = 1; 

非自动提交模式

Set autocommit = 0;


      本文转自噼里啪啦啦 51CTO博客,原文链接:http://blog.51cto.com/pilipala/1670693 ,如需转载请自行联系原作者









相关实践学习
基于CentOS快速搭建LAMP环境
本教程介绍如何搭建LAMP环境,其中LAMP分别代表Linux、Apache、MySQL和PHP。
全面了解阿里云能为你做什么
阿里云在全球各地部署高效节能的绿色数据中心,利用清洁计算为万物互联的新世界提供源源不断的能源动力,目前开服的区域包括中国(华北、华东、华南、香港)、新加坡、美国(美东、美西)、欧洲、中东、澳大利亚、日本。目前阿里云的产品涵盖弹性计算、数据库、存储与CDN、分析与搜索、云通信、网络、管理与监控、应用服务、互联网中间件、移动服务、视频服务等。通过本课程,来了解阿里云能够为你的业务带来哪些帮助     相关的阿里云产品:云服务器ECS 云服务器 ECS(Elastic Compute Service)是一种弹性可伸缩的计算服务,助您降低 IT 成本,提升运维效率,使您更专注于核心业务创新。产品详情: https://www.aliyun.com/product/ecs
相关文章
|
22天前
|
SQL 关系型数据库 MySQL
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
轻松入门MySQL:保障数据完整性,MySQL事务在进销存管理系统中的应用(12)
|
1月前
|
关系型数据库 MySQL 数据库
MySQL事务(简单明了)
MySQL事务(简单明了)
|
1月前
|
SQL 关系型数据库 MySQL
MySQL索引与事务
MySQL索引与事务
104 0
|
2月前
|
存储 关系型数据库 MySQL
Mysql高可用|索引|事务 | 调优
Mysql高可用|索引|事务 | 调优
|
1月前
|
关系型数据库 MySQL 数据库
深入探讨MySQL并发事务的问题及解决方案
深入探讨MySQL并发事务的问题及解决方案
74 0
|
2月前
|
NoSQL 关系型数据库 MySQL
MySQL - 深入理解 MySQL 的事务和隔离级别
MySQL - 深入理解 MySQL 的事务和隔离级别
207 0
|
1月前
|
SQL 关系型数据库 MySQL
【MySQL 数据库】4、MySQL 事务学习
【MySQL 数据库】4、MySQL 事务学习
44 0
|
2月前
|
SQL 关系型数据库 MySQL
Mysql事务隔离级别和锁特性
Mysql事务隔离级别和锁特性
|
1天前
|
存储 SQL 关系型数据库
MySQL 事务
MySQL 事务
|
15天前
|
存储 SQL 关系型数据库
【MySQL实战笔记】03.事务隔离:为什么你改了我还看不见?-02
【4月更文挑战第7天】数据库通过视图实现事务隔离,不同隔离级别如读未提交、读已提交、可重复读和串行化采用不同策略。以可重复读为例,MySQL使用多版本并发控制(MVCC),每个事务有其独立的视图。回滚日志在无更早视图时被删除。长事务可能导致大量存储占用,应避免。事务启动可显式用`begin`或设置`autocommit=0`,但后者可能意外开启长事务。建议使用`autocommit=1`并显式管理事务,若需减少交互,可使用`commit work and chain`。
30 5