一个示例:

银行引用是事务的一个经典例子:假如银行有两张表,一张支票表,一张储蓄表,现在需要从Jones用户的支票账户转移200¥ 至储蓄账户,那么至少需要三步:

1. 检查Jones的支票账户余额是否大于200¥

2. Jones的支票账户-200¥

3. Jones的储蓄账户+200¥

上述三步可组成一个事务,当2、3步故障时,之前执行的操作会自动回滚,保证数据的一致性。

MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!

在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。

事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。

事务用来管理 insert,update,delete 语句

一般来说,事务是必须满足4个条件(ACID)::原子性(Atomicity,或称不可分割性)、一致性(Consistency)、隔离性(Isolation,又称独立性)、持久性(Durability)。

原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。

一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。

隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。

持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

注意:在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION,或者执行命令 SET AUTOCOMMIT=0,用来禁止使用当前会话的自动提交。

事务控制语句:

BEGIN或START TRANSACTION;显式地开启一个事务;

COMMIT;也可以使用COMMIT WORK,不过二者是等价的。COMMIT会提交事务,并使已对数据库进行的所有修改成为永久性的;

ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;

SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;

RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;

ROLLBACK TO identifier;把事务回滚到标记点;

SET TRANSACTION;用来设置事务的隔离级别。InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

START   TRANSACTION       #开启事务

ROLLBACK        #回滚事务

COMMIT             #提交事务

SAVEPOINT identifier          #事务语句过多时,可以创建一个保存点,单独还原至此点

ROLLBACK [WORK] TO [SAVEPOINT] identifier        #还原事务至此点

RELEASE SAVEPOINT identifier                                 #删除保存点2、

2、直接用 SET 来改变 MySQL 的自动提交模式:

SET AUTOCOMMIT=0 禁止自动提交

SET AUTOCOMMIT=1 开启自动提交

隔离级别:

1. READ UNCOMMITTED (读未提交)

2. READ COMMITTED(读提交)

3. REPEATEABLE READ(可重复读)

4. SERIALIZABLE(序列化)

各个隔离级别可能产生的问题:

a.脏读,当前线程事务可以读取另一个线程事务未提交修改的数据。

b.不可重复读,事务提交前看到的数据不一致(别的线程修改提交); 线程1开启事务查询数据一个样,当线程2开启事务修改提交后,线程1再次查询发现数据修改(未提交),这就是不可重复读。

c.幻读, 可重复读级别通过MVCC机制保证事务提交前看到的数据都是一致的,但是又有一个新问题,当线程2修改完数据提交后,线程1看到的还是未修改前的原始数据,但实际底层数据已被更改,当线程1提交后发现数据改变,像幻觉一样,这就是幻读。

d.加锁读,SERIABLIZEBLE 为了解决幻读问题,当线程事务1查询数据,线程事务2修改数据会被锁住,因为数据具有不确定性。

事务参考:1

转载于:https://blog.51cto.com/6854290/2328935

011—MySQL 事务相关推荐

  1. DB-MySQL:MySQL 事务

    ylbtech-DB-MySQL:MySQL 事务 1.返回顶部 1. MySQL 事务 MySQL 事务主要用于处理操作量大,复杂度高的数据.比如说,在人员管理系统中,你删除一个人员,你即需要删除人 ...

  2. ci mysql 事务_MySQL事务-学习笔记

    MySQL事务-学习笔记 MySQL事务 事务的意义 案例:银行转账过程 A向B转账500,A原来有1000,B有500. 分析: SQL处理过程: A 减少 500 B 增加 500 以上两点必须同 ...

  3. 面试官灵魂的一击:你懂MySQL事务吗?

    " 今天无聊来撩一下MySQL事务,希望你们喜欢~ 目录 概念 隔离性与隔离级别 事务隔离的实现 事务启动方式 MVCC工作原理 总结 一.概念 事务到底是什么东西呢?想必大家学习的时候也是 ...

  4. Mysql 事务中Update 会锁表吗?

    Mysql 事务中Update 会锁表吗? 两种情况: 1.带索引 2.不带索引 前提介绍: 方式:采用命令行的方式来模拟 1.mysq由于默认是开启自动提交事务,所以首先得查看自己当前的数据库是否开 ...

  5. mysql 事务id_[转]MySQL 5.6 全局事务 ID(GTID)实现原理(一)

    http://dev.mysql.com/doc/refman/5.6/en/replication-gtids.html 在这篇文档里,我们可以知道全局事务 ID 的官方定义是: GTID = so ...

  6. Mysql事务字符集

    Mysql事务 Innodb存储引擎的中的事务完全服务ACID: 原子性.2.一致性.3.隔离性.4.持久性 理解上和oracle类似. 事务隔离级别 1.Read uncommitted 读未提交: ...

  7. mysql事务并发控制_mysql事务和多版本并发控制详解

    一.mysql事务 事务就是一组原子性的SQL查询,或者说一个独立的工作单元.如果数据库引擎可以成功执行该组全部语句,那么就执行该组语句.如果其中有任何一条语句不能执行,那么所有的语句都不会执行.也就 ...

  8. php mysql事务

    这里记录一下php操作mysql事务的一些知识 要知道,MySQL默认的行为是在每条SQL语句执行后执行一个COMMIT语句,从而有效的将每条语句独立为一个事务.但是,在使用事务时,是需要执行多条sq ...

  9. mysql事务四个安全级别_四个MySQL事务隔离级别的详细说明

    本文中的实验测试环境: Windows 10 + cmd + MySQL5.6.36 + InnoDB 首先,交易的基本要素(ACID) 1. 原子性: 事务开始后 2. 一致性(Consistenc ...

  10. 如果MySQL事务中发生了网络异常?

    一 前言 在我们运维MySQL的时候,总会遇到各种情况导致程序和MySQL之间的会话异常中断,比如 假如强制关闭应用 假如client机器突然崩溃宕机/断电 假如网络发生抖动/网卡发生故障 机房级别断 ...

最新文章

  1. 04.并发和互斥.md
  2. linux的11186端口,linux – CentOS – semanage – 删除端口范围
  3. 图像数据格式基础知识
  4. JavaScript面向对象编程指南(五) 原型
  5. oracle强制走索引_实验验证:Oracle聚簇因子对索引使用的影响
  6. 关于Maven项目build时出现No compiler is provided in this environment的处理
  7. 手把手教你0基础C语言速通
  8. 主题模型(Topic Model)与LDA算法
  9. Freescale mx27 DDR 初始化代码分析
  10. 网易云音乐 linux x32,网易云音乐 for Mac
  11. WebQQ3.0体验
  12. 中文 Uncode 编码范围
  13. 使用clonezilla(在生龙)克隆系统
  14. 我的世界python指令_我的世界Minecraft从0开始学指令。
  15. 恢复SQL Server简单模式下误删除堆表记录
  16. python存数据库c读数据库喷码加工_python图片文字识别
  17. 贪心--CF645E
  18. 一文带你了解什么是PACS系统源码
  19. OSChina 周日乱弹 ——我已经开始适应这个身体了
  20. java class文件反编译 去掉无用注释

热门文章

  1. 关于Oracle返回值
  2. 深入理解Solaris内核中互斥锁(mutex)与条件变量(condvar)之协同工作原理
  3. LintCode 二叉树的最小深度
  4. jQuery file upload测试
  5. java反射对实体类取值和赋值,可以写成通过实体类获取其他元素的数据,很方便哦~~~...
  6. php独立环境的安装:apache php mysql
  7. 【BZOJ4837】LRU算法 [模拟]
  8. Spring整合Struts2,Hibernate的xml方式
  9. 养兔子Fibo函数优化
  10. WinForm 窗体基本属性、公共控件