首页 > 其他分享 >事务(Transaction)

事务(Transaction)

时间:2022-10-26 21:12:03浏览次数:49  
标签:语句 事务 Transaction 隔离 read 提交 级别

1、什么是事务
一个事务是一个完整的业务逻辑单元,不可再分。

比如:银行转账,从A账户向B账务转账10000,需要执行两条update语句

update t_act set balance = balance - 10000 where actno = 'act-001' ; 
update t_act set balance = balance + 10000 where actno = 'act-002' ; 

以上两条DML语句必须同时成功,或同时失败,不允许一条成功,一条失败!

想要保证以上的两条DML语句(update、insert、delete)同时成功或者同时失败,那么就需要使用数据库的“事务机制” !

 

2、事务原理
假设一个事儿,需要先执行一条insert,再执行一条update,最后执行一条delete,这个事儿才算完成。

开启事务机制(开始)

  • 执行insert语句–>insert.(这个执行成功之后,把这个执行记录到数据库的操作历史当中,并不会向文件中保存-条数据,不会真正的修改硬盘上的数据。)
  • 执行update语句—> update…(这个执行也是记录一下历史操作,不会真正的修改硬盘上的数据)
  • 执行delete语句---->delete…(这个执行也是记录一下历史操作【记录到缓存】,不会真正的修改硬盘上的数据)

提交事务或者回滚事务(结束)

怎么提交事务,怎么回滚事务?

提交事务:commit;语句

回滚事务:rollback;语句==(回滚永远都是只能回到上次事务的提交点!)==

MySQL默认的事务行为是怎么样的?

MySQL默认情况下是支持自动提交事务的。(自动提交):就是一条DML提交一次!

怎么样才能将MySQL的自动提交事务关闭呢?

先执行如下命令:start transaction ,开启事务,也是将自动提交事务关闭!

在次命令后的指定的DML语句并不会持久化到数据库,等待commit | rollback 操作!

3、事务的特性:ACID
A:原子性(atomicity):事务是最小的工作单元,不可再分。

C:一致性(consistency):事务必须保证多条DML语句同时成功或同时失败。

I :隔离性(isolation):事务A与事务B之间具有隔离。

D:持久性(durability):持久性说的时最终的数据必须持久化道硬盘文件中,事务才算成功的结束。

4、事务的隔离性

将事务A与事务B分别比作教室A,B,然而它们之间的墙就是隔离性,墙越厚隔离级别越高!(这种墙分为四个级别)

  • 第一级别:读未提交(read uncommitted):我们当前事务可以读取对方未提交的事务,
  • 存在问题:存在脏读(Dirty read)现象,表示读到了脏的数据。
  • 第二级别:读已提交(read committed):我们当前事务可读取对方已提交的事务,解决了脏读现象,存在问题:不可重复读。
  • 第三级别:可重复读(repeatable read):解决不可重复读,永远读取到的都是开启事务时的数据,==存在问题:读取到的数据是幻像(幻读)==例如:执行一条查询的sql需要从1点3点,那么这条sql读取的一直是1点的数据,即使13点之间存在其他操作,该sql的结果并不会受到影响,类似快照,一直读取的是快照中的数据。
  • 第四级别:序列化读/串行化读(serializable):解决了所有问题。 效率低,需要事务排队(类似于synchronized)。

Oracle数据库默认级别:第二级别;读已提交

Mysql数据库默认级别:第三级别,可重复读

5、验证各种隔离级别

对以上各种隔离级别做一个验证

通过命令 select @@tx_isolation;查看当前事物的隔离级别 !
+-------------------+
| @@tx_isolation    |
+-------------------+
| REPEATABLE-READ   |
+-------------------+

读未提交(read uncommitted):

#执行如下命令,设置全局的事务隔离级别为读未提交
set global transaction isolation level read uncommitted;

读已提交(read committed):

测试 读已提交(read committed)

#执行如下命令,设置全局的事务隔离级别为读已提交
set global transaction isolation level read committed;

 

可重复读(repeatable read):

测试:可重复读(repeatable read)

#执行如下命令,设置全局的事务隔离级别为可重复读
set global transaction isolation level read committed;

序列化读/串行化读(serializable):

测试 序列化读/串行化读(serializable)

#执行如下命令,设置全局的事务隔离级别为可重复读
set global transaction isolation level serializable;

  

 

标签:语句,事务,Transaction,隔离,read,提交,级别
From: https://www.cnblogs.com/wyh518/p/16829782.html

相关文章

  • 事务-四大特征和隔离级别介绍
    事务-四大特征1.原子性:是不可分割的最小操作单位,要么同时成功,要么同时失败。2.持久性:当事务提交或回滚后,数据库会持久化的保存数据。3.隔离性:多个事务之间。相互独立。......
  • 分布式事务
    http://icyfenix.cn/architect-perspective/general-architecture/transaction/distributed.html 分布式事务本章中所说的分布式事务(DistributedTransaction)特指多个......
  • 【Java技术总结】Spring事务失效总结
    事务方法必须是public,private、protected、default都会失效。@ServicepublicclassUserService{@Transactionalprivatevoidadd(UserModeluserModel){......
  • 强一致性分布式事务与最终一致性分布式事务方案
    强一致性事务解决方案优点:1)数据一致性比较高2)在任意时刻都能都够查询到最新写入的数据缺点:1)存在性能问题,在分布式事务未完全提交和回滚之前,应用不能查询到最新的数据......
  • Mybatis事务控制
    https://blog.csdn.net/weixin_34392906/article/details/91425640一.1. 概述 对数据库的事务而言,应该具有以下几点:创建(create)、提交(commit)、回滚(rollback)、关闭(close......
  • Lock wait timeout exceeded; try restarting transaction
    Lockwaittimeoutexceeded;tryrestartingtransaction1.异常java.lang.reflect.InvocationTargetException:nullatsun.reflect.NativeMethodAccessorImpl.invoke......
  • mysql事务和隔离级别学习--笔记
    一、MySQL事务1、什么事事务事务(transaction)就是一个最小的单独任务单元由一个或多个SQL语句组成,在这个任务单元中,每个SQL语句都是相互依赖,整个任务单元是作为一个不可分......
  • 一种基于柔性事务的分布式事务解决方案设计探究
    1背景市面上常见的有,2pc/3pc、tcc、saga等常见的分布式事务解决方案,但是实际实施起来框架比较重,设计开发比较繁琐,不易于快速开发上手。本文提供一种基于柔性事务设计的简......
  • SpringCloud整合分布式事务Seata 1.4.1 支持微服务全局异常拦截
    项目依赖SpringBoot2.5.5SpringCloud2020.0.4AlibabaSpringCloud2021.1MybatisPlus3.4.0Seata1.4.1(需要与服务器部署的Seata版本保持一致)。。。。Seata介......
  • JDBC管理事务_概述与JDBC管理事务_实现
    JDBC管理事务_概述JDBC控制事务:1.事务:一个包含多个步骤的业务操作。如果这个业务操作被事务管理,则这个多个步骤要么同时成功要么同时失败。......