事务

作者: 御都 | 来源:发表于2019-08-04 09:17 被阅读0次

1 定义:

如果一个包含多个步骤的业务操作,被事务管理,要么同时成功,要么同时失败。
1.1 举例


image.png

转账操作站在数据库的角度看有以上3步。在没有被事务管理时,如果第2步出现异常,可能会出现张三的账户少了500,李四的账号没收到这500。
被事务管理,开启事务后,如果在第2步出现了异常,则进行回滚,张三账户金额不变,提示你转账失败。如果顺利完成转账的3步,最后要提交事务,整个事务就完成了。

2 事务的操作

2.1 开启事务 :start transaction
2.2 回滚:rollback,回滚到开启事务的时候
2.3 提交事务:commit,结束事务
2.4 例子:
2.4.1 预置条件

--创建一个account表
create table account (id int primary key auto_increment,name varchar(20),balance decimal(10,2));
--插入数据
mysql> insert account (name,balance) values ('zhangsan',1000.00),('lisi',1000.00);
Query OK, 2 rows affected (0.00 sec)
Records: 2  Duplicates: 0  Warnings: 0
mysql> select * from account;
+----+----------+---------+
| id | name     | balance |
+----+----------+---------+
|  1 | zhangsan | 1000.00 |
|  2 | lisi     | 1000.00 |
+----+----------+---------+
2 rows in set (0.00 sec)

2.4.1 没有设置事务,在从张三转500给李四的过程中出错。

---省略查看账户余额这一步
--从zhangsan的账户中减去500;
mysql> update account set balance = balance - 500.00 where name = 'zhangsan';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0
---把lisi的名字写错成lishi,lisi的账户未增加500;
mysql> update account set balance = balance + 500.00 where name = 'lishi';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
--张三的500块不见了
mysql> select * from account;
+----+----------+---------+
| id | name     | balance |
+----+----------+---------+
|  1 | zhangsan |  500.00 |
|  2 | lisi     | 1000.00 |
+----+----------+---------+
2 rows in set (0.00 sec)

mysql> 

2.4.2 设置事务,过程中发现出错,rollback会见状态还原到开启事务时。

mysql> select * from account;
+----+----------+---------+
| id | name     | balance |
+----+----------+---------+
|  1 | zhangsan | 1000.00 |
|  2 | lisi     | 1000.00 |
+----+----------+---------+
2 rows in set (0.00 sec)
---开启事务
mysql> start transaction;
Query OK, 0 rows affected (0.00 sec)

mysql> update account set balance = balance - 500.00 where name = 'zhangsan';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0
---发现操作出错,lisi的名字打错成lishi
mysql> update account set balance = balance + 500.00 where name = 'lishi';
Query OK, 0 rows affected (0.00 sec)
Rows matched: 0  Changed: 0  Warnings: 0
----回滚,回到开启事务时的状态
mysql> rollback;
Query OK, 0 rows affected (0.00 sec)
mysql> select * from account;
+----+----------+---------+
| id | name     | balance |
+----+----------+---------+
|  1 | zhangsan | 1000.00 |
|  2 | lisi     | 1000.00 |
+----+----------+---------+
2 rows in set (0.01 sec)

2.4.3 设置事务,过程中没有出错,操作完成后,进行提交,结束该事务。

mysql> update account set balance = balance - 500.00 where name = 'zhangsan';
Query OK, 1 row affected (0.01 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> update account set balance = balance + 500.00 where name = 'lisi';
Query OK, 1 row affected (0.00 sec)
Rows matched: 1  Changed: 1  Warnings: 0

mysql> select * from account;
+----+----------+---------+
| id | name     | balance |
+----+----------+---------+
|  1 | zhangsan |  500.00 |
|  2 | lisi     | 1500.00 |
+----+----------+---------+
2 rows in set (0.00 sec)
--提交,结束事务
mysql> commit;
Query OK, 0 rows affected (0.01 sec)

相关文章

  • java事务

    1、java事务介绍 2、JDBC事务 3、JTA事务 1、java事务介绍 java事务分类:JDBC事务、...

  • 事务、MySQL与Python交互、Python 中操作 MyS

    1、事务 事务操作分两种:自动事务(默认)、手动事务 手动事务的操作流程 开启事务:start transacti...

  • 数据库事务书目录

    数据库事务 事务概念 本地事务 全局事务 全局事务的定义 J2EE中全局事务的实现 全局事务的优缺点 基于消息的分...

  • MySQL事务

    MySQL-innodb-事务 事务的特性 事务的生命周期 失败的事务: 事务的控制语句 面试题 事务日志-red...

  • mysql事务隔离机制及其隔离级别、实现原理分析

    目录 事务特性ACID属性 并发事务带来的问题 事务隔离级别 事务实现原理 事务特性ACID属性 事务特性指的就是...

  • MULE事务配置

    在mule的事务可能为jdbc事务,jms事务,xa事务等,多种事务.这里讲解事务的几个动作: 相关的文档:htt...

  • 事务—事务模型

    程序猿基础知识的学习、理解、整理——事务(方方土) 事务,看似很简单,其实很复杂,作为一个程序猿,你对事务到底了解...

  • 事务—XA事务

    程序猿基础知识的学习、理解、整理——事务(方方土) 什么是XA事务?在什么场景下会出现XA事务? @Transac...

  • 事务—事务模式

    程序猿基础知识的学习、理解、整理——事务(方方土) 什么是事务模式?这里提到的事务模式,主要是指在系统设计过程中的...

  • JDK动态代理给Spring事务埋下的坑

    service 模拟动态代理事务 测试类 预测结果模拟事务:开启事务execute doLink模拟事务:关闭事务...

网友评论

      本文标题:事务

      本文链接:https://www.haomeiwen.com/subject/sidedctx.html