MySQL-第十四篇事务管理
1、什么是事务
事务是由一步或者几步数据库操作序列组成的逻辑执行单元,这系列操作要么全部执行,要么全部放弃执行。
2、事务具备的4个特性:
1》原子性(Atomicity):事务是应用中最小的执行单位,事务是应用中不可再分的最小逻辑执行体。
2》一致性(Consistency):事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态。当数据库只包含事务成功提交的结果时,数据库处于一致性状态。如果系统运行发生中断,某个事务尚未完成而被迫中断,而该未完成的事务对数据库所做的修改已被写入数据库,此时数据库就处于一种不正确的状态。一致性是通过原子性来保证的。
3》隔离性(Isolation):各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务都是隔离的。
4》持续性(Durability):持续性也称为持久性,指事务一旦提交,对数据所做的任何改变都要记录到永久存储器中,通常就是保存进物理数据库。
3、数据库的事务由下列语句组成:
1》一组DML语句,经过这组DML语句修改后的数据将保持较好的一致性。
2》一条DDL语句
3》一条DCL语句
DDL和DCL语句最多只能是一条,因为DDL和DCL语句都会导致事务立即提交。
4、当事务所包含的全部数据库操作都成功执行后,应该提交(commit)事务,使修改永久生效。事务提交的两种方式:
1》显式提交:使用commit
2》自动提交:执行DDL或DCL语句,或者程序正常退出。
5、当事务所包含的任意一个数据库操作执行失败后,应该回滚(rollback)事务,使该事务中所做的修改全部失效。事务回滚的两种方式:
1》显示回滚:使用rollback。
2》自动回滚:系统错误或者强行退出。
6、MySQL默认关闭事务(即打开自动提交)。为了开启MySQL的事务支持,可以显式调用如下命令:
SET AUTOCOMMIT = {0 | 1}//0为关闭自动提交,即开启事务
一旦在MySQL的命令行窗口中输入以上语句关闭自动提交,该命令行窗口里的所有DML语句都不会立即生效。上一个事务结束后第一条DML语句将开始一个新的事务,而后续执行的所有SQL语句都处于该事务中,除非显式使用commit来提交事务、或者正常退出、或者运行DDL、DCL语句导致事务隐式提交。当然也可以使用rollback回滚来结束事务,使用rollback结束事务将导致本次事务中的DML语句所做的修改全部失效。
(注意:一个MySQL命令行窗口代表一次连接session,在该窗口里设置set autocommit=0,相当于关闭了该连接session的自动提交,对其他连接不会有任何的影响,即其他命令行窗口不受这个设置影响。)
7、如果不想关闭整个命令行窗口的自动提交,而是想临时性地开始事务。
可以使用MySQL提供的start transaction或begin两个命令,处于start transaction或begin后的DML语句不会立即生效,除非使用commit显式提交事务,或者使用DDL、DCL语句来隐式提交事务。
8、提交,不管是显式提交还是隐式提交,都会结束当前事务;回滚,不管是显式回滚还是隐式回滚,都会结束当前事务。
9、MySQL还提供了savepoint来设置事务的中间点,通过设置事务的中间点可以让事务回滚到指定的中间点,而不是回滚全部事务。
savepoint a;
一旦设置了中间点,就可以使用rollback回滚到指定中间点。
rollback a;
10、JDBC的事务支持
1》JDBC连接也提供了事务支持,JDBC连接的事务支持由Connection提供,Connection默认打开自动提交,即关闭事务。可以调用Connection的setAutoCommit()方法来关闭自动提交,开启事务。
//关闭自动提交,开启事务
conn.setAutoCommit(false);
一旦事务开始之后,程序可以像平常一样创建Statement对象,创建了Statement对象之后,可以执行任意多条DML语句。
程序还可以调用Connection提供的getAutoCommit()方法来返回该连接的自动提交模式。
Connection的commit()方法和rollback()方法:
conn.commit();
conn.rollback();
注意:当Connection遇到一个未处理的SQLException异常时,系统将会非正常退出,事务也会自动回滚。但如果程序捕获了该异常,则需要在异常处理块中显式地回滚事务(手动回滚)。
2》Connection也提供了设置中间点的方法:
1>Savepoint setSavepoint():在当前事务中创建一个未命名的中间点,并返回代表该中间点的Savepoint对象。
2>Savepoint setSavepoint(String name):在当前事务中创建一个具有指定名称的中间点,并返回代表该中间点的Savepoint对象。
根据中间点回滚,并不关心中间点的名字,而是根据中间点对象回滚,Connection的rollback(Savepoint savepoint)方法进行回滚到指定中间点。
MySQL-第十四篇事务管理的更多相关文章
- SpringBoot第二十四篇:应用监控之Admin
作者:追梦1819 原文:https://www.cnblogs.com/yanfei1819/p/11457867.html 版权声明:本文为博主原创文章,转载请附上博文链接! 引言 前一章(S ...
- 第十四篇 Integration Services:项目转换
本篇文章是Integration Services系列的第十四篇,详细内容请参考原文. 简介在前一篇,我们查看了SSIS变量,变量配置和表达式管理动态值.在这一篇,我们使用SQL Server数据商业 ...
- 【译】第十四篇 Integration Services:项目转换
本篇文章是Integration Services系列的第十四篇,详细内容请参考原文. 简介在前一篇,我们查看了SSIS变量,变量配置和表达式管理动态值.在这一篇,我们使用SQL Server数据商业 ...
- 跟我学SpringCloud | 第十四篇:Spring Cloud Gateway高级应用
SpringCloud系列教程 | 第十四篇:Spring Cloud Gateway高级应用 Springboot: 2.1.6.RELEASE SpringCloud: Greenwich.SR1 ...
- Spring Cloud第十四篇 | Api网关Zuul
本文是Spring Cloud专栏的第十四篇文章,了解前十三篇文章内容有助于更好的理解本文: Spring Cloud第一篇 | Spring Cloud前言及其常用组件介绍概览 Spring C ...
- 解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译)
解剖SQLSERVER 第十四篇 Vardecimals 存储格式揭秘(译) http://improve.dk/how-are-vardecimals-stored/ 在这篇文章,我将深入研究 ...
- Python之路【第十四篇】:AngularJS --暂无内容-待更新
Python之路[第十四篇]:AngularJS --暂无内容-待更新
- Egret入门学习日记 --- 第十四篇(书中 5.4~5.6节 内容)
第十四篇(书中 5.4~5.6节 内容) 书中内容: 总结 5.4节 内容重点: 1.如何编写自定义组件? 跟着做: 重点1:如何编写自定义组件? 文中提到了重要的两点. 好,我们来试试看. 第一步, ...
- 闯祸了,生成环境执行了DDL操作《死磕MySQL系列 十四》
由于业务随着时间不停的改变,起初的表结构设计已经满足不了如今的需求,这时你是不是想那就加字段呗!加字段也是个艺术活,接下来由本文的主人咔咔给你吹. 试想一下这个场景 事务A在执行一个非常大的查询 事务 ...
随机推荐
- case_match
//箭头符号 => 隔开了模式和表达式.//选择器 match {备选项}.//只要发现有一个匹配的case,剩下的case不会继续匹配. //object case_test {//// de ...
- java Byte源码分析
源码: public static int toUnsignedInt(byte x) { return ((int) x) & 0xff; } 原理: -128(byte) 原码:10000 ...
- zookeeper之三 ZKClient客户端的使用
ZKClient在原生API接口上进行了包装,同时在内部实现了诸如session超时重连.watcher反复注册等功能,使得zookeeper客户端繁琐的细节对开发人员透明.下面将从以下几个方面来使用 ...
- Django【第4篇】:Django之模板继承
jango框架之模板继承和静态文件配置 一.模板继承 目的是:减少代码的冗余 语法: {% block classinfo %} {% endblock %} 具体步骤: 1.创建一个base.htm ...
- windows 10安装python3和python2
安装包下载: 安装包下载请点我 下载完安装包就可以开始安装了,下面是流程图! Python3.6安装流程: 选择自定义安装: 直接next 为电脑上的所有用户安装 然后install就ok了! 安装完 ...
- Pool数据池
sql相关请点我!!! 1.普通的sql语句查询完成之后,就要断开,下次查的时候又要重新开启,这样的话,效率会很低,所以利用pool 数据池来解决这种问题,pool数据池查询完之后,就不用去重新链接数 ...
- flask_session
flask_session和Flask中的session相比,比较简单,省去了 secret_key 首先,导入flask_session 模块 from flask_session import ...
- mybatis动态update语句
- mybatis时间范围查询
<if test="excStartTime!=null and excStartTime!=''"> <![CDATA[ and DATE_FORMAT(dl. ...
- Java冠军程序员告诉你如何提升技术
让我们跟着兄弟连JavaEE培训 导师,聊一聊——怎样成为冠军程序员 ? 我认为以下几点能力是非常有帮助的: 1.强大的记忆力.当 我上八年级的时候,全因那位死气沉沉的历史老师,让我自己都相信我的记忆 ...