mysql事务(详解)
Mysql事务
一、事务存在的意义
1、事务定义
- 事务:事务是一个最小的不可在分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,该业务是一个最小的工作单元)
- 一个完整的业务需要批量的DML(insert、update、delete)语句共同联合完成。
- 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同。
2.事务是什么?
多个操作同时进行,那么同时成功,那么同时失败。这就是事务。
事务有四个特性:一致性、持久性、原子性、隔离性
比如有一个订单业务
1.订单表当中添加一条记录 2.商品数量数据更新(减少) 3…
当多个任务同时进行操作的时候,这些任务只能同时成功,或者同时失败。
3.Mybatis关于事务的管理
MyBatis框架中的事务默认是手动提交的,也就是每次编写程序都需要调用commit()方法提交事务
<transactionManager type="JDBC"></transactionManager> ====》程序员自己控制处理的提交和回滚
二、事务的四大性质
原子性:事务是一个不可分割的工作单位,要么同时成功,要么同时失败。例:当两个人发起转账业务时,如果A转账发起,而B因为一些原因不能成功接受,事务最终将不会提交,则A和B的请求最终不会成功。
持久性:一旦事务提交,他对数据库的改变就是永久的。注:只要提交了事务,将会对数据库的数据进行永久性刷新。
隔离性:多个事务之间相互隔离的,互不干扰
一致性:事务执行接收之后,数据库完整性不被破坏
注意:只有当前三条性质都满足了,才能保证事务的一致性
刷脏:Mysql为了保证存储效率,于是每次将要读写的文件是先存储在缓存池中,对于数据的操作是在缓存池中,而mysql将会定期的刷新到磁盘中。
1、如何保证原子性:
首先:对于A和B两操作要操作成功就一定需要更改到表的信息,如果如图所示A语句操作成功,而B语句操作时出现断电等其他情况终止了操作,所以此时两个事务没有操作成功,在没有提交事务之前,mysql会先记录跟新前的数据到undo log日志里面,当最终的因为操作不成功而发生事务回滚时,会从undo log日志里面先前存好的数据,重新对数据库的数据进行数据的回退。
undo log日志:(撤销回退的日志)主要存储数据库更新之前的数据,用于作备份
2、如何保证事务的持久性:
通过重做日志:redo log日志,对于用户将对发生了修改而为提交的数据存入了redo log日志中,当此时发生断电等其他异常时,可以根据redo log日志重新对数据做一个提交,做一个恢复。
3、隔离性:
1事务的并发问题:
1、脏读(读未提交)
(1)、脏读:事务A读取到了事务已经修改但未提交的数据,这种数据就叫脏数据,是不正确的
2、读已提交:(不可重复读)
不可重复读:对于事务A多次读取同一个数据时,由于其他是事务也在访问这个数据,进行修改且提交,对于事务A,读取同一个数据时,有可能导致数据不一致,叫不可重复读
3、可重复读:(幻读)
幻读:原因:因为mysql数据库读取数据时,是将数据放入缓存中,当事务B对数据库进行操作:例如删除所有数据且提交时,事务A同样能访问到数据,这就产生了幻读。
问题:解决了可重复读,但是会产生一种问题,错误的读取数据,对于其他事务添加的数据也将访问不到
4、串行化
串行化:事务A和事务B同时访问时,在事务A修改了数据,而没有提交数据时,此时事务B想增加或修改数据时,只能等待事务A的提交,事务B才能够执行。
**问题:**用户的体验十分的差,因为每次访问时都要等待其他事务的提交才能操作
伴随着对应的解决方案:
2事务的隔离等级:
隔离性的隔离级别
- 读未提交 read uncommitted
- 读已提交 read committed
- 可重复读 repeatable read
- 串行化 serializable
(1)、读未提交:事物A和事物B,事物A未提交的数据,事物B可以读取到。 这种隔离级别最低,这种级别一般是在理论上存在,数据库隔离级别一般都高于该级别。 三种并发问题都没解决。
set global transaction isolation level read uncommitted;
#查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;
(2)、读已提交:事务A只能读取到事务B提交的数据,这种级别可以避免“脏数据” ,这种隔离级别会导致“不可重复读取” ,Oracle默认隔离级别
set global transaction isolation level read committed;
查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;
(3)、可重复读:- 事务A和事务B,事务A提交之后的数据,事务B读取不到 - 事务B是可重复读取数据 - 这种隔离级别高于读已提交 - 换句话说,对方提交之后的数据,我还是读取不到 - 这种隔离级别可以避免“不可重复读取”,达到可重复读取 - 比如1点和2点读到数据是同一个 - MySQL默认级别 - 虽然可以达到可重复读取,但是会导致“幻像读”
set global transaction isolation level repeatable read;
查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;
(4)、串行化:事务A和事务B,事务A在操作数据库时,事务B只能排队等待 这种隔离级别很少使用,吞吐量太低,用户体验差 这种级别可以避免“幻像读”,每一次读取的都是数据库中真实存在数据,事务A与事务B串行, 而不并发
set global transaction isolation level serializable;查看当前隔离级别
select @@global.tx_isolation,@@tx_isolation;
3隔离级别的一致性的关系:
三、事务的相关技术代码
- 开启事务:START TRANSACTION
- 事务的提交:COMMIT
ages/image-20220605111202527.png" alt=“image-20220605111202527” style=“zoom:80%;” />
三、事务的相关技术代码
- 开启事务:START TRANSACTION
- 事务的提交:COMMIT
- 事务的回滚:ROLLBACK (一旦事务提交失败,我们需要将数据回滚到之前的状态,需要用到rollback语句)
mysql事务(详解)相关推荐
- Spring事务和MySQL事务详解面试
文章目录 数据库事务 事务是什么 事务的四大特性 MySQL事务隔离级别 查看MySQL当前事务隔离级别 MySQL默认操作模式为自动提交模式 JDBC处理事务 Spring事务 Spring的事务传 ...
- MySQL 事务详解
前言 要么全都带走,要么一无所有. ---- 卡牌大师 崔斯特 在实际业务场景中,如何保证操作的完整性是一个重要的议题,依次执行一系列逻辑强关联的操作,如果在中途发生了错误,就很有可能导致数据的错乱. ...
- SpringBoot事务详解
文章目录 一.简介 1.介绍 2.事务特点 3.事务实现方式 3.1 MySql事务实现方式 3.2 SpringBoot实现机制 二.@Transactional详解 1.@Transactiona ...
- mysql dba系统学习-数据库事务详解
mysql dba系统学习-数据库事务详解 上个星期去面试数据库管理员的工作,笔试通过之后就是直接的面试,他问了我一个问题,叫我介绍哈数据库的事务的看法和理解,但是不知所错的没有章法的乱答一气,唉唉, ...
- 史上最简单MySQL教程详解(进阶篇)之存储引擎介绍及默认引擎设置
什么是存储引擎? MySQL存储引擎种类 MyISAM 引擎 InnoDB引擎 存储引擎操作 查看存储引擎 存储引擎的变更 修改默认引擎 什么是存储引擎? 与其他数据库例如Oracle 和SQL Se ...
- mysql权限和使用注意事项及mysql 数据类型详解和innodb,myisam区别
mysql用户权限管理(Grant,Revoke) MySQL可以为不同的用户分配严格的.复杂的权限.这些操作大多都可以用SQL 指令Grant(分配权限)和Revoke(回收权限)来实现. Gran ...
- Spring源码(八):Spring事务详解
Spring事务详解 一.事务执行流程 二.Spring事务切面 三.事务切面的Pointcut和Advice 四.注解事务的源码分析 五.Sping事务的传播属性 六.Sping事务的异常校验 七. ...
- pandas读写MySQL数据库详解及实战
pandas读写MySQL数据库详解及实战 SQLAlchemy是Python中最有名的ORM工具. 关于ORM: 全称Object Relational Mapping(对象关系映射). 特点是操纵 ...
- Mysql Explain 详解
Mysql Explain 详解 一.语法 explain < table_name > 例如: explain select * from t3 where id=3952602; 二. ...
- MySQL存储过程详解 mysql 存储过程
mysql存储过程详解 1. 存储过程简介 我们常用的操作数据库语言SQL语句在执行的时候需要要先编译,然后执行,而存储过程(Stored Procedure)是一组为了完成特定功能的S ...
最新文章
- java protobuffer 网络_使用Protobuf定义网络协议
- 手写Redis服务端,从设计者的角度聊一聊Redis本身
- 【控制】《多智能体系统的动力学分析与设计》徐光辉老师-第9章-不确定分数阶系统的包含控制
- 领域应用 | 大众点评搜索基于知识图谱的深度学习排序实践
- java判断变量是奇书还是偶数_测试值是奇数还是偶数
- sr锁存器 数电_C06. SR锁存器的认识
- 解决办法:configure: error: You requested SRTP (requires libsrtp) but not found...die
- Js调用Paypal接口支付
- 【入门】萌新IP入门常识(一):什么是IP地址和代理IP
- 硬盘检测工具MHDD图文教程
- 使用C++ Builder编译QuantLib
- 怎么快速学会计算机程序知识,零基础学电脑怎样才能学得快,自学电脑的基础知识分享...
- qlabel 里内容字体颜色位置不同样式设置_OR视觉丨这4款应用就是我手机里必备的修图APP...
- 少儿编程Scratch学习教程--Scratch介绍及参赛相关
- 数据化运营14 洞察与获客:如何⾼效拉新获客?
- 学机器人编程课以后有用吗
- 电化学发光分析仪常用分析方法
- C++ 模板类的嵌套
- Hexo 博客加入豆瓣读书界面(综合教程)
- Springboot集成使用swagger2