首页 > 其他分享 >事务的简单介绍

事务的简单介绍

时间:2022-10-27 00:11:26浏览次数:75  
标签:事务 隔离 tx isolation 介绍 提交 简单 级别

事务的ACID特性

A-原子性

事务一个原子操作单元,对于数据的修改,要么全部执行,要么全部执行

以下有两种情况需要分析?

事务提交了,如果此时Buffer Pool的脏页没有刷盘,如何保证修改的数据生效?

如果事务没有提交,但是Buffer Pool脏页刷盘了,如果保证不该存在的数据撤销?

以上问题,需要引入Undo和Redo的概念,每次写事务,都会修改BudfferPool,从而产生相应的Redo和Undo日志,再刷新到磁盘之前,这些日志信息都会先写入到日志文件中

C-一致性

事务一旦提交,它对数据库中的数据的改变应该是永久性的,后续的操作或者故障不应该对其有任何的影响,不会丢失

 

 

I-隔离性

一个事务的执行不应该被其他的事务干扰

InnoDB支持的隔离性有四种,隔离级别从低到高,读未提交,读提交,可重复读,可串行化

锁和多版本控制技术就是用于保障隔离性

D-持久性

事务开始之前和是事务结束之后,数据库的完整性限制未被破坏

 

脏读:一个事务读到了另一个事务修改但未提交的数据

不可重复读:一个事务中多次读取同一行记录不一致,后面读取的和前面读取的不一致 

幻读:一个事务中多次按照相同的条件查询,结果不一致,后续查询的结果和前面查询的结果不同,多了或少了行记录

处理事务的相关方案:

第一种是排队,完全按照顺序执行所有事务的数据库操作,不需要加锁,也就是全局排队,效果就是某一时刻只能处理一个事务操作

第二种是排他锁,先进入的事务独占数据项,其他事务被阻塞,等待前面的事务释放锁

第三种是读写锁,细化锁的颗粒度,区分读操作和写操作,让读和读之间不加锁,即可以实现读和读的并行,但是读和写,写和读,写和写几种情况之间还是需要加排它锁的

第四种MVCC,实现了对读和读并行,读和写并行,写和读并行,但是为了保持一致性,写和写并行没法实现

 MVCC实现原理

目前只能在读已经提交的和可重复读两种隔离级别下工作

在MVCC并发控制中,读操作可以分为两类:快照读和当前读

数据库的事务隔离级别越高,并发问题就越小,但是并发处理能力就越差,事务的隔离级别,针对的是InnoDB引擎,支持事务的功能

查询mysql数据库的事务隔离级别的命令

show variables like 'tx_isolation'

 手动设置事务的隔离级别

设置隔离级别为读未提交
set tx_isolation='READ-UNCOMMITTED'

  

设置隔离级别为读已提交
set tx_isolation='READ-COMMITTED'

 

设置事务隔离级别为重复读
set tx_isolation='REPEATABLE-READ'

  

设置事务隔离级别为序列化
set tx_isoaltion='SERIALIZABLE'

  

 分别对四种事务的隔离级别进行说明

读未提交
处理更新丢失的问题,但是会造成脏读,意思就是读取其他会话中未提交的但是已经修改的数据

  

读已提交
只能读取其他会话中已经提交的数据,解决了脏读问题

以上对事务的隔离级别,锁,,mvcc进行了简单说明,下面介绍使用说明,

事务的隔离级别底层是对锁和mvcc的一种封装,类似对于事务并发控制的整体解决方案,只是隐藏了底层细节

锁是事务并发控制的基础,事务隔离性使用锁实现,不同的操作使用不同的锁,解决不同的读写操作问题

对于用户来说,首先使用隔离级别处理问题,当隔离级别无法处理问题时,然后考虑使用锁

mysql的默认隔离:可重复读

mysql查询事务隔离级别  show variables like 'tx_isolation'

oracle的默认隔离级别:读已提交

 

 构建一个session处于事务中

declare
trans_id Varchar2(100);
begin
trans_id := dbms_transaction.local_transaction_id( TRUE );
end;

  记得不要提交

SELECT s.sid, s.serial#,CASE BITAND(t.flag, POWER(2, 28))
WHEN 0 THEN 'READ COMMITTED'
ELSE 'SERIALIZABLE' END AS isolation_level
FROM v$transaction t
JOIN v$session s ON t.addr = s.taddr AND s.sid = sys_context('USERENV', 'SID');

常规开发使用默认的隔离级别,高并发需求中引入悲观锁,乐观锁处理问题

标签:事务,隔离,tx,isolation,介绍,提交,简单,级别
From: https://www.cnblogs.com/q202105271618/p/16504134.html

相关文章

  • JDBC连接MySQL(简单)
    JDBC连接MySQL    加载及注册JDBC驱动程序         Class.forName("com.mysql.jdbc.Driver");         Class.forName("com......
  • InterruptedException与interrupt()方法简单说明
    InterruptedException在如下场景下会发生,即使用sleep(),wait(),join()方法时packagecom.java.test.Interrupted.expection;importlombok.SneakyThrows;importlomb......
  • docker笔记:docker容器通信参数 --link参数介绍
    1、link参数作用同一个宿主主机上的多个docker容器之间如果需要进行通信,第一种最容易想到的方式就是使用容器自身的ip地址、宿主主机的ip+容器暴露出的端口号来通信,我们知......
  • 事务(Transaction)
    1、什么是事务一个事务是一个完整的业务逻辑单元,不可再分。比如:银行转账,从A账户向B账务转账10000,需要执行两条update语句updatet_actsetbalance=balance-10000w......
  • Spring Aop的学习(一):Spring Aop的简单入门
    1.什么是AOPAOP(AspectOrientedProgramming):面向切面编程,是OOP(面向对象编程)的一个延续,其和OOP一样,也是一种编程思想。不过AOP是一种横向开发模式。2.AOP的作用及......
  • requests模块/openpyxl模块/简单爬虫实战
    内容概要第三方模块的下载及使用网络爬虫及requests模块网络爬虫实战爬取二手房信息自动化办公领域模块openpyxl练习题及答案第三方模块的下载第三方模块就类似与......
  • PO模式介绍及案例
    概念PO(PageObject)设计模式是一种面向对象(页面对象)的设计模式,将测试对象及单个的测试步骤封装在每个Page对象以page为单位进行管理。优点可以使代码复用降低维护成本......
  • 华为云对象存储服务OBS,海量存储安全可靠,让云存储更加简单
    随着产业数字化转型大潮的到来,企业生产经营过程中产生的数据也越来越多,不管是大型企业还是小微企业对数据存储备份的要求也越来越高,有的企业选择自购硬件设备进行存储,一方面......
  • C#调用接口的简单流程
    1.编写url地址stringurl="http://192.168";2.创建http请求对象HttpWebRequestrequest=(HttpWebRequest)WebRequest.Create(url);3.指定请求方法request.Method="......
  • mysql学习---简单的数据库初始化脚本和sql分析
    1、创建库、表、权限等DROPDATABASEIFEXISTS`KMS_DB`;CREATEDATABASEIFNOTEXISTS`KMS_DB`CHARACTERSET`utf8`COLLATE`utf8_general_ci`;/*characterset,数......