热门标签 | HotTags
当前位置:  开发笔记 > 编程语言 > 正文

mysqlsave之前回退_MySQL事务处理(transaction)(二十八)

MySQL支持的几种数据库引擎,并非所有的引擎都支持明确的事务处理管理,MYISAM和INNODB是最常用的引擎,而MYISAM不支持事务

MySQL支持的几种数据库引擎,并非所有的引擎都支持明确的事务处理管理,MYISAM 和 INNODB 是最常用的引擎,而MYISAM 不支持事务处理,innodb支持事务处理,所以一定要正确 使用引擎类型。

事务处理(transaction processing):可以用来维护数据库的完整性,保证成批的MySQL操作要么完全执行,要么完全不执行。

在关系型数据库设计把数据存储在多个表中,使数据更容易操纵、维护和重用。

如:订单存储在orders 表和orderitems  表中,order存储实际的订单,而orderitems 存储订购的各项物品,这两个表使用主键相互关联,又包含客户和产品信息的其他表相关联

给系统添加订单的过程如下

1、检查数据库中是否存在相应的客户(从customer 表中查询),如果不存在添加他/她

2、检索客户的ID

3、添加一行到orders 表,把它与客户ID关联

4、检索orders表中赋予的新的订单ID

5、对于订购的每个物品在orderitems 表中添加一行,通过检索出来的ID 把它与orders表关联(以及通过产品ID 与product表关联)

从中可以看出,一个添加订单的过程涉及的客户表,订单表,订单明细表,产品表(要是复杂一点可能还涉及到物流配送,库存占用)

如果要是数据库发生了某种故障(如超出磁盘空间,安全限制,表锁等)阻止了这个过程的完成。

如果故障发生在添加了客户之后,orders 表添加之前,不会有什么问题。某些客户没有订单是完全合法的。在重新执行此过程时,所插入的客户将被检索和使用,可以有效地从出故障的地方开始执行此过程。

如果故障发生在order行添加之后,orderitems行添加之前,会导致数据库中有一个空的订单

如果故障发生在系统在给orderitems添加行时,会导致数据库出现一个不完整订单而且你还不知道。

如何解决,这个时候事务处理就发挥作用了,事务处理是一种机制,用来管理必须成批的执行MySQL操作,以保证数据库不包含不完整的操作结果。

利用事务机制可以保证一组操作不会中途停止,他们要么作为整体执行,要么完全不执行(除非明确指示),如果没有发生错误,整组sql语句都会执行将数据写入到数据库,如果出现错误,则进行回退(撤销)恢复到这组操作之前的数据状态。

使用事务后相同的操作就会变成

1、检查数据库中是否存在相应的客户,如果不存在,添加他/她

2、提交客户信息

3、检索客户的ID

4、添加一行到orders 表

5、如果在添加行到orders 表时处理故障,回退

6、检索orders 表中赋予的新订单ID

7、对于订购的每项物品,添加新行到orderitems表

8、如果在添加新行到orderitems时出现故障,回退所添加的orderitems 行和orders 行

9、提交订单信息

控制事务处理

One、在使用事务和事务处理时常用的关键字

事务(transaction)指一组SQL语句

回退(rollback)指撤销指定SQL语句的过程

提交(commit)指将未存储的SQL语句结果写入数据表

保留点(savepoint)指事务处理中设置的临时占位符(placeholder),你可以对它发布回退(与回退整个事务处理不同)

注意:当commit 或 rollback 语句执行后,事务会自动关闭

Two、开启事务

管理事务处理的关键在于将sql语句组分解成逻辑块,并确定规定数据何时应该回退,何时不应该回退。

-- 标识事务的开始

start transaction

Three、使用 ROLLBACK(回退:用来管理insert 、update、delete 语句)

ROLLBACK 只能在一个事务处理内使用,也就是在执行了一条start transaction之后,将start transaction 之后的所有语句回退。

--开启事务

start transaction;--在事务中删除 ordertotals

delete fromordertotals;--查看一下还有没

select * fromordertotals;--回退,反悔了不能删除

rollback;

6c926b143510798bf1b3aae610d7a81d.png

上述,首先查询不为空的一个表,然后开启了一个事务处理,用一条delete语句删除这个表中的所有行,验证一下是否空了,这时用一条回退(rollback)语句,将start transaction 之后的所有语句回退,最后验证一下是否成功。

注意:

事务处理ROLLBACK用来管理insert 、update、delete 语句,不能回退Crete、drop、select操作(虽然可以执行但是没用)。

Four、使用COMMIT(提交)

一般的MySQL语句都是直接针对数据表执行和编写的。这就是所谓的隐含提交(implicit commit),即提交(也可以叫写、保存)操作是自动进行的。

注意:在事务处理块中,提交不会隐含地进行,为了进行明确的提交,要使用commit 语句。

--从数据库中删除订单号为 20007的订单,注意要先删除明细在删除订单,不然由于主外键的关系导致删除不了--开启事务

start transaction;--删除明细表中

delete from orderitems where order_num = 20007;--删除订单表中

delete from orders where order_num = 20007;--提交

commit;

ceb5147b425cc0ef0f2920aa693638ae.png

上述中,从数据库中完全删除订单20010.,主要涉及更新两个数据表orders 和 orderitems,所以使用事务处理块来保证订单不被部分删除,最后使用commit 语句仅在不出错时写出更改,如果第一条删除语句起作用,但第二条失败,则delete语句不会被提交(而会被自动撤销)

Five、使用保留点(savepoint)

简单的rollback 和commit 语句就可以写入或撤销整个事务处理,但是更复杂事务处理可能会部分提交或回退,所以引入了保留点

如之前的添加订单场景,如果发生错误回退到 添加 orders 行之前就行,不需要回退到客户表

为了支持回退部分事务处理,必须能在事务处理块中合适的位置防止占位符,这样如果需要回退,就可以回退到某个占位符。而这些占位符就称为保留点(创建时可以使用 savepoint 声明)

--创建保留点

savepoint 保留点名--回退到保留点

rollback to 保留点名

082b78b88a8794289d1f786bba9cc8fb.png

注意:

1、每个保留点的名字必须要唯一而且要有意义,以便在回退时,MySQL知道回到哪

2、可以设置任意多的保留点,而且时越多越好,因为保留点越多,就越可以灵活的进行回退

3、保留点在事务处理完成(即执行一条Rollback或commit )之后自动释放,在MySQL 5 后也可以用RELEASE SAVEPOINT 明确的释放保留点。

Six、更改默认的提交 (autocommit)

默认的MySQL行为时自动提交所有更改,也就是任何时候执行一条MySQL语句,该语句对表的更改时立即执行生效的。如果要想关闭可以使用以下语句;

--关闭默认提交

set autocommit = 0;

注意:

1、autocommit 决定是否自动提交更改,不管有没有commit 语句,设置autocommit 为 0(假)指示MySQL不自动提交更改,直到autocommit设置为真时为止。

2、autocommit 标志是针对每个连接而不是服务器。

原文:https://www.cnblogs.com/obge/p/13149883.html



推荐阅读
  • 本文介绍了在开发Android新闻App时,搭建本地服务器的步骤。通过使用XAMPP软件,可以一键式搭建起开发环境,包括Apache、MySQL、PHP、PERL。在本地服务器上新建数据库和表,并设置相应的属性。最后,给出了创建new表的SQL语句。这个教程适合初学者参考。 ... [详细]
  • 本文介绍了数据库的存储结构及其重要性,强调了关系数据库范例中将逻辑存储与物理存储分开的必要性。通过逻辑结构和物理结构的分离,可以实现对物理存储的重新组织和数据库的迁移,而应用程序不会察觉到任何更改。文章还展示了Oracle数据库的逻辑结构和物理结构,并介绍了表空间的概念和作用。 ... [详细]
  • 本文介绍了如何使用php限制数据库插入的条数并显示每次插入数据库之间的数据数目,以及避免重复提交的方法。同时还介绍了如何限制某一个数据库用户的并发连接数,以及设置数据库的连接数和连接超时时间的方法。最后提供了一些关于浏览器在线用户数和数据库连接数量比例的参考值。 ... [详细]
  • 关于我们EMQ是一家全球领先的开源物联网基础设施软件供应商,服务新产业周期的IoT&5G、边缘计算与云计算市场,交付全球领先的开源物联网消息服务器和流处理数据 ... [详细]
  • Java String与StringBuffer的区别及其应用场景
    本文主要介绍了Java中String和StringBuffer的区别,String是不可变的,而StringBuffer是可变的。StringBuffer在进行字符串处理时不生成新的对象,内存使用上要优于String类。因此,在需要频繁对字符串进行修改的情况下,使用StringBuffer更加适合。同时,文章还介绍了String和StringBuffer的应用场景。 ... [详细]
  • MyBatis多表查询与动态SQL使用
    本文介绍了MyBatis多表查询与动态SQL的使用方法,包括一对一查询和一对多查询。同时还介绍了动态SQL的使用,包括if标签、trim标签、where标签、set标签和foreach标签的用法。文章还提供了相关的配置信息和示例代码。 ... [详细]
  • 本文详细介绍了SQL日志收缩的方法,包括截断日志和删除不需要的旧日志记录。通过备份日志和使用DBCC SHRINKFILE命令可以实现日志的收缩。同时,还介绍了截断日志的原理和注意事项,包括不能截断事务日志的活动部分和MinLSN的确定方法。通过本文的方法,可以有效减小逻辑日志的大小,提高数据库的性能。 ... [详细]
  • 云原生边缘计算之KubeEdge简介及功能特点
    本文介绍了云原生边缘计算中的KubeEdge系统,该系统是一个开源系统,用于将容器化应用程序编排功能扩展到Edge的主机。它基于Kubernetes构建,并为网络应用程序提供基础架构支持。同时,KubeEdge具有离线模式、基于Kubernetes的节点、群集、应用程序和设备管理、资源优化等特点。此外,KubeEdge还支持跨平台工作,在私有、公共和混合云中都可以运行。同时,KubeEdge还提供数据管理和数据分析管道引擎的支持。最后,本文还介绍了KubeEdge系统生成证书的方法。 ... [详细]
  • [译]技术公司十年经验的职场生涯回顾
    本文是一位在技术公司工作十年的职场人士对自己职业生涯的总结回顾。她的职业规划与众不同,令人深思又有趣。其中涉及到的内容有机器学习、创新创业以及引用了女性主义者在TED演讲中的部分讲义。文章表达了对职业生涯的愿望和希望,认为人类有能力不断改善自己。 ... [详细]
  • 本文详细介绍了Linux中进程控制块PCBtask_struct结构体的结构和作用,包括进程状态、进程号、待处理信号、进程地址空间、调度标志、锁深度、基本时间片、调度策略以及内存管理信息等方面的内容。阅读本文可以更加深入地了解Linux进程管理的原理和机制。 ... [详细]
  • 本文详细介绍了在ASP.NET中获取插入记录的ID的几种方法,包括使用SCOPE_IDENTITY()和IDENT_CURRENT()函数,以及通过ExecuteReader方法执行SQL语句获取ID的步骤。同时,还提供了使用这些方法的示例代码和注意事项。对于需要获取表中最后一个插入操作所产生的ID或马上使用刚插入的新记录ID的开发者来说,本文提供了一些有用的技巧和建议。 ... [详细]
  • 本文详细介绍了Spring的JdbcTemplate的使用方法,包括执行存储过程、存储函数的call()方法,执行任何SQL语句的execute()方法,单个更新和批量更新的update()和batchUpdate()方法,以及单查和列表查询的query()和queryForXXX()方法。提供了经过测试的API供使用。 ... [详细]
  • 本文讨论了在数据库打开和关闭状态下,重新命名或移动数据文件和日志文件的情况。针对性能和维护原因,需要将数据库文件移动到不同的磁盘上或重新分配到新的磁盘上的情况,以及在操作系统级别移动或重命名数据文件但未在数据库层进行重命名导致报错的情况。通过三个方面进行讨论。 ... [详细]
  • ALTERTABLE通过更改、添加、除去列和约束,或者通过启用或禁用约束和触发器来更改表的定义。语法ALTERTABLEtable{[ALTERCOLUMNcolu ... [详细]
  • web.py开发web 第八章 Formalchemy 服务端验证方法
    本文介绍了在web.py开发中使用Formalchemy进行服务端表单数据验证的方法。以User表单为例,详细说明了对各字段的验证要求,包括必填、长度限制、唯一性等。同时介绍了如何自定义验证方法来实现验证唯一性和两个密码是否相等的功能。该文提供了相关代码示例。 ... [详细]
author-avatar
林韵杰64833
这个家伙很懒,什么也没留下!
PHP1.CN | 中国最专业的PHP中文社区 | DevBox开发工具箱 | json解析格式化 |PHP资讯 | PHP教程 | 数据库技术 | 服务器技术 | 前端开发技术 | PHP框架 | 开发工具 | 在线工具
Copyright © 1998 - 2020 PHP1.CN. All Rights Reserved | 京公网安备 11010802041100号 | 京ICP备19059560号-4 | PHP1.CN 第一PHP社区 版权所有