Mysql事务

避免事务,会占用内存

事务是啥?

简而言之:事务 - 就是保护多条执行的sql语句,要么全部成功,要么全部失败

比如:转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户,这两个操作看做一体

事务是在哪个层实现的?

事务是引擎层实现的,mysql是多引擎的系统,不是所有引擎都支持事务的,比如MySQL原生的MyISAM就不支持事务,这也是MyIASM被InnoDB取代的原因之一。

事务ACID特性

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。(简单的案例就是银行转账,A转账给B,不会发生A转账成功,B没收到钱,只可能是A转账失败)
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务的四种隔离级别和默认级别

mysql查看隔离级别

select @@tx_isolation;

隔离级别

1.读未提交
2.读以提交
3.可重复读
4.串行化
set tx_isolation='read-uncommitted';
set tx_isolation='read-committed';
set tx_isolation='repeatable-read';
set tx_isolation='serializable';
其实还有一种就是无事务,当我没说

数据库默认的级别是可重复读

很久以前主从复制,是基于binlog的,在Mysql在5.0这个版本以前,binlog只支持STATEMENT这种格式!而这种格式在读已提交(Read Commited)这个隔离级别下主从复制是有bug的(主从不一致),因此Mysql将可重复读(Repeatable Read)作为默认的隔离级别!

解决方案其中一种就是就是提高隔离级别到可重复读,所以默认就设为可重复读

项目中的隔离级别

设置

#查看隔离级别
SELECT @@tx_isolation; #配置文件修改隔离级别为读提交,之后在重启服务
[mysqld]
transaction-isolation=Read-Committed

项目中

项目中我们一般都是使用读已提交这个隔离级别,我们知道读已提交会有不可重复读和幻读的问题,那我们为啥选择读以提交

为啥不用,读提交和串行化

一个逻辑上就说不过去,还有一个性能不佳

对比读提交(RC)和可重复读(RR)为何选择读提交

缘由一:在RR隔离级别下,存在间隙锁,导致出现死锁的几率比RC大的多!

缘由二:在RR隔离级别下,条件列未命中索引会锁表!而在RC隔离级别下,只锁行

缘由三:在RC隔离级别下,半一致性读(semi-consistent)特性增加了update操作的并发性!

事务隔离级别

原理

事务的隔离性其实是由锁来实现的

读未提交(脏读):

允许一个事务读取另外一个事务没有提交的数据。

读提交(解决脏读可能出现的问题):

指一个事务只能读取到另外一个事务已经提交的数据。

可重复读:(解决不可重复读可能出现的问题):

当数据在另一事务操作中时,无法读取,只有当那个事务完成了,才能读取到数据。

串行化(解决幻读):

sql按顺序执行,不会出现问题,但是效率低。

隔离级别总结

脏读

一个事务获取到另一个事务还没有提交的数据修改,这样的操作是很危险的,因为没有提交的修改是可以回滚的

不可重读

一个事务内查询数据,查询相同的数据,在后面的查询会突然变化

可重复读

当一个事务对某个记录进行了修改,那么另一个事务查询得到数据是没有修改之前的数据(快照),只有当两个事务都提交完之后才会读取修改后的数据

幻读:(假设本来有两条数据)

当一个事务添加了一条记录(3),并且提交后,另一个事务执行,查询只有2条数据(可重复读),但是如果这个时候进行一个全表更新更改数据的操作之后,在查询就有3条数据,这就是幻读

串行化:(没有并发能力)

串行化,就是事务一个一个执行,一个事务在操作一个表,就会给这个表加锁,别的事务无法读取和操作这个表,直到事务一提交

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

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

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

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

案例

# mysql中事务的执行
create table bank(
id int,
name varchar(16),
money decimal(65, 2)
);
insert into bank values(1, 'Tom', 10), (2, "Bob", 10); # 假设出现以下执行情况 # 没有事务支持情况下,Tom的钱就丢了
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='ruakei'; # 将两条sql看做事务处理
# 开启事务
begin;
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='ruakei';
# 确认无误,提交事务
commit;
# 确认有误,回滚
rollback;

参考博客:

https://blog.csdn.net/DorAction/article/details/87971378

https://www.cnblogs.com/shoshana-kong/p/10516404.html

http://www.zsythink.net/archives/1233

MySQL事务和隔离级别的更多相关文章

  1. MySQL事务学习-->隔离级别

    MySQL事务学习-->隔离级别 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性,提出的事务隔离级别. 数据库是要被广大客户所共享访问的,那么在数据库操作过程中 ...

  2. MySQL事务及隔离级别详解

    MySQL事务及隔离级别详解 作者:尹正杰 版权声明:原创作品,谢绝转载!否则将追究法律责任. 一.MySQL的基本架构 MySQL的基本架构可以分为三块,即连接池,核心功能层,存储引擎层. 1> ...

  3. MySql事务及隔离级别

    在数据库中,所谓事务是指作为单个逻辑工作单元执行的一系列操作. 事务的操作: 先定义开始一个事务,然后对数据作修改操作, 这时如果提交(COMMIT),这些修改就永久地保存下来 如果回退(ROLLBA ...

  4. MySql事务的隔离级别及作用

    逻辑工作单元遵循一系列(ACID)规则则称为事务. 原子性:保证事务是一系列的运作,如果中间过程有一个不成功则全部回滚,全部成功则成功.保证了事务的原则性. 一致性:一致性指的是比如A向B转100块钱 ...

  5. [转]MySQL事务学习-->隔离级别

    From : http://blog.csdn.net/mchdba/article/details/12837427 6 事务的隔离级别 设置的目的 在数据库操作中,为了有效保证并发读取数据的正确性 ...

  6. MySQL事务及隔离级别(读书小结)

    标签: MySQL事务 隔离 0.什么是事务? 事务是指MySQL的一些操作看做是一个不可分割的执行单元.事务的特点是要么所有操作都执行成功,要么一个都不执行.也就是如果一个事务有操作执行失败,那么就 ...

  7. MySQL事务的隔离级别

    为什么需要隔离 当多个线程都开启事务操作数据库中的数据时,数据库系统要能进行隔离操作,以保证各个线程获取数据的准确性,在介绍数据库提供的各种隔离级别之前,我们先看看如果不考虑事务的隔离性,会发生的几种 ...

  8. mysql 事务、隔离级别

    一.事务的四大特性(ACID) 1.原子性(Atomicity):事务开始后所有操作,要么全部做完,要么全部不做,不可能停滞在中间环节.事务执行过程中出错,会回滚到事务开始前的状态,所有的操作就像没有 ...

  9. MySQL——事务ACID&隔离级别

    数据库事务ACID&隔离级别 什么是事务 事务是用户定义的一个数据库操作序列.这些操作要么全执行,要么全不执行,是一个不可分割的工作单元.在关系型数据库中,事务可以是一条SQL语句,也可以是一 ...

  10. MySQL 事务的隔离级别

    转载:https://developer.aliyun.com/article/743691?accounttraceid=80d4fddb3dc64b97a71118659e106221tozz 简 ...

随机推荐

  1. 爬虫基本库的使用---requests库

    使用requests---实现Cookies.登录验证.代理设置等操作 处理网页验证和Cookies时,需要写Opener和Handler来处理,为了更方便地实现这些操作,就有了更强大的库reques ...

  2. 条款03:尽肯使用const

    定义常量 define 是一个Compile-Time的概念,它的生命周期止于编译器期,它存在与程序的代码段,在实际程序中它只是一个常数.一个命令中的参数.并没有实际的存在 const常量存在于程序的 ...

  3. 使用Bind提供域名解析服务(正向解析)

    小知识: 一般来讲域名比IP地址更加的有含义.也更容易记住,所以通常用户更习惯输入域名来访问网络中的资源,但是计算机主机在互联网中只能通过IP识别对方主机,那么就需要DNS域名解析服务了. DNS域名 ...

  4. mysql设计规范二

    一.基本规范 必须使用InnoDB存储引擎 必须使用UTF8字符集 数据表.数据字段必须加入中文注释 二.设计规范 库名称.表名称.字段名称必须使用小写,最好不要使用驼峰式,使用“_”区分,例如use ...

  5. [考试反思]1023csp-s模拟测试84:精妙

    一套很奇怪的题.单调性+神仙dp/搜索+随机化. 但是说实在的,思路都很不错. 考场上显然乱搞没什么好说的. 虽说T2剪枝打错变量名掉了20分... T1:Smooth 暴力各有不同,最暴力的想法就是 ...

  6. [考试反思]0907NOIP模拟测试39:角落

    题比较简单,但是做的非常烂. T1是个愚蠢的找规律组合数快速幂,数组开小了(看错数据范围) T2题目保证联通没看见,hack掉了正解. T3也挺蠢的,但是打乱了,思路不是很清晰导致丢了50分. 只能说 ...

  7. 微信小程序如何解析html内容

    最近项目上遇到在微信小程序里需要显示新闻内容,新闻内容是通过接口读取的服务器中的富文本内容,是html格式的,小程序默认是不支持html格式的内容显示的,那我们需要显示html内容的时候,就可以通过w ...

  8. P3128 [USACO15DEC]最大流

    秒切树上查分....(最近一次集训理解的东西) 但是,我敲了半小时才切掉这道题.... 我一直迷在了“边差分”和“点差分”的区别上. 所以,先说一下此题,再说一下区别. 首先,想到差分很容易. 然后, ...

  9. Apache的虚拟主机功能

    Apache的虚拟主机功能 (Virtual Host) 是可以让一台服务器基于IP.主机名或端口号实现提供多个网站服务的技术. 第一种情况:基于IP地址 这种情况很常见:一台服务器拥有多个IP地址, ...

  10. lenovo ubuntu18.04 找不到网络适配器

    链接: https://pan.baidu.com/s/1YJl-MfG0tVy9sLx4_otmnA 提取码: smfp https://blog.csdn.net/John_chaos/artic ...