前言:

  因为没有多少时间和精力,目前无法深入研究数据库中的事务,比如

  但是,对于事务的一些基本知识,还是需要牢牢掌握的,做到了解事务的基本常识,在实际开发中能够理解各个持久层框架对事务的处理

一:是么是事务?

  下面是百度百科的结果

   

    在开发中对于一个业务逻辑需要对数据进行的一系列CRUD操作,这一系列操作,我们可以把它称为一个事务

    这样理解事务就必须了解事务四大特性:原子性 、一致性、隔离性、持久性

二:事务的四大特性--ACID

  2.1:原子性

    在一个事务中对数据的所有操作,属于一个单元,不可分割,只有成功或者失败,不可能某个操作成功某个操作失败

  2.2:一致性

    事务前后,数据的一致性,在既定规则下的事务处理过程中,必须严格按照既定规则操作数据,不可破坏规则

    维护数据的一致性任务应该由程序员来完成

    比如数据修改前为 10.00 修改完后变成了 5.5 满足一致性应该为5.50(这是我自己的理解)

  2.3:隔离性

    体现在并发事务情况下,多个事务互相隔离,互不影响

  2.4:持久性

    在正确提交事务后,对数据的修改将是永久性的

三:事务的隔离级别

  体现在并发事务中的读的操作

  事务有四个隔离级别:READ-UNCOMMITTED 、  READ COMMITTED、 REPEATABLE READ 、 SERIALIZABLE

  MySQL默认使用repeatable read级别--可重复读

  3.1:脏读

    在事务A中读取到事务B修改了但是未提交的数据,一旦其他事务回滚了,那么这样式比较危险的,读取到了错误的数据

  3.2:不可重复读

    事务中读取到其他事务提交后的数据,重复读取相同数据可能发现前后结果矛盾,因此叫 不可重复读

    解决了脏读,但是在事务A中可以读取到事务B提交后的数据(导致在事务A中多次执行相同的读的操作的结果不同)

  3.3:可重复读

    在一个事务中不会读取到其他事务提交后的数据,重复读取数据前后结果一致,因此叫 可重复读

    但是事务B如果在查询数据后对又修改,然后再读取数据,此时结果逻辑上可能不正确,好像前面读取时发生了幻觉!!

图解MySQL默认隔离级别可重复读解决的问题和存在的问题

  3.4:串行化

    可能在分布式事务中会使用

总结:首先我们需要明确一点,所有隔离级别,可能出现的问题或者所解决的问题都有一个前提,那就是在一个事务中

   对于前三个隔离级别都有各自存在的问题,问题严重程度是递减的

     可能出现的问题都发生在select语句中,毕竟 脏读、不可重复读,可重复读,幻读,都有一个读字

   对于递增的隔离级别,试图要解决的问题是

      脏读:读取到的数据可能是错误的(其他事务未正确提交,或者回滚),可能导致我们错误的判断,错误的数据操作,必须解决

    不可重复读:前后读取的数据不一致,某种程度上违背了事务的隔离性原则;但是在一个事务单元中,相同的读取操作却每次的结果都可能不一样,某种程度上也会让我们感到困惑

    可重复读:相同条件下每次读取到的结果都一样,仅仅是在我们读取前后之间对数据操作有可能会导致结果在本事务中逻辑上存在错误,但是数据本身是没有错的

    对于不可重复读和可重复读,虽然都有各自的缺点,但是都不影响我们对数据的修改,持久化数据的操作(update)总会获取当前最新的值。

四:事务的分类

  4.1:扁平事务(FLAT TRANSACTION)

  4.2:带有保存点的扁平事务(FLAT TRANSACTION WITH SAVPOINTS)

  4.3:链式事务(Chained TRANSACTION)

  4.4:嵌套事务(Nested Transaction) InnoDB不支持

  4.5:分布式事务(Distributed Transaction)--ATM机跨行转账案例

五:MYSQL中的事务

  innoDB是MYSQL数据库的默认存储引擎,支持事务操作

  本来想自己亲手测试一下,不同事务隔离级别对数据读取的影响,想想还是算了吧,了解了就可以了

  MYSQL默认事务隔离级别是REPEATABLE READ---可重复读

  

十:MYSQL中的事务的更多相关文章

  1. 【MySQL】漫谈MySQL中的事务及其实现

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySQL,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  2. 漫谈MySql中的事务

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  3. MySql中的事务嵌套

    1.Mysql中的事务必须是InnoDB.Berkeley DB引擎,myisam不支持. 2.Mysql是不支持嵌套事务的,开启了一个事务的情况下,再开启一个事务,会隐式的提交上一个事务. 3.My ...

  4. MySQL中Procedure事务编写基础笔记

    原文:MySQL中Procedure事务编写基础笔记 目录: 一.PROCEDURE: 二.CREATE PROCEDURE基本语法: 三.PROCEDURE小进阶   3.1.基本的DECLARE语 ...

  5. MySql中的事务、JDBC事务、事务隔离级别

    一.MySql事务 之前在Oracle中已经学习过事务了,这个东西就是这个东西,但是在MySql中用法还是有一点不同,正好再次回顾一下. 先看看MySql中的事务,默认情况下,每执行一条SQL语句,都 ...

  6. (转)漫谈MySql中的事务

    最近一直在做订单类的项目,使用了事务.我们的数据库选用的是MySql,存储引擎选用innoDB,innoDB对事务有着良好的支持.这篇文章我们一起来扒一扒事务相关的知识. 为什么要有事务? 事务广泛的 ...

  7. 举例说明MySQL中的事务

    一.场景导入 现在有一张仓库表,仓库表中记录了每一个物品的数量,还有一张用户表,用户购买产品,仓库表的产品数量减少,而用户拥有产品的数量增加. 但是如果仓库中的产品数量不足时怎么处理? 例子: #仓库 ...

  8. 【转】全面了解Mysql中的事务

    为什么要有事务? 事务广泛的运用于订单系统.银行系统等多种场景.如果有以下一个场景:A用户和B用户是银行的储户.现在A要给B转账500元.那么需要做以下几件事: 1. 检查A的账户余额>500元 ...

  9. 在MySQL中设置事务隔离级别有2种方法:

    在MySQL中设置事务隔离级别有2种方法: 1 在my.cnf中设置,在mysqld选项中如下设置 [mysqld] transaction-isolation = READ-COMMITTED 2 ...

随机推荐

  1. JSP | 基础 | Button跳转页面

    <input type = "button" value = "登陆" onclick = "window.location.href = 'L ...

  2. iOS 同一个View识别单击和双击手势

    1.给View添加手势 //view添加两个手势检测方法 self.currentPlayerView.userInteractionEnabled = YES; UITapGestureRecogn ...

  3. CF #546div2D

    题目本质:只有能做到一路过关斩将的勇者才能冒泡过来救出女主. 主要代码: ; int n, m, a[maxn], ans; vector<int> edge[maxn]; set< ...

  4. 洛谷1052(路径压缩后简单dp)

    同POJ3744写法都是一样的. 距离太长无意义可以压缩,注意不是随便压的,想一想可以跟%T发生关系. #include <cstdio> #include <cctype> ...

  5. 学习中对input()的一些总结(raw_input()与input())

  6. Redis基础理论

    一.概述 二.数据类型 STRING LIST SET HASH ZSET 三.数据结构 字典 跳跃表 四.使用场景 计数器 缓存 查找表 消息队列 会话缓存 分布式锁实现 其它 五.Redis 与 ...

  7. Rabbitmq~linux环境的部署

    之前写过在windows环境上部署rabbitmq,这回介绍在centos上对这个消息中间件进行部署的过程 一 下载和解压 wget  http://www.rabbitmq.com/releases ...

  8. SpringBoot项目取消数据库配置

    1. 错误springboot项目启动时,如果没有配置数据库配置,启动时会抛出如下异常. Description: Cannot determine embedded database driver ...

  9. 连接sql server、插入数据、从数据库获取时间(C#)

    using System; using System.Data.SqlClient; namespace Test { //连接数据库 public class Connection { privat ...

  10. CF1061B Views Matter

    思路: 贪心. 实现: #include <bits/stdc++.h> using namespace std; ]; int main() { int n, m; while (cin ...