MySQL 事务管理「终于解决」

MySQL 事务管理「终于解决」事务的4个特性(ACID) 原子性 Atomicity。每个事务中的操作,要么都成功,要么都失败 一致性 Consistency。事务执行前后,数据库中的数据应该保持一致 隔离性 Isolation。

MySQL 事务管理

 

事务的4个特性(ACID)

  • 原子性 Atomicity。每个事务中的操作,要么都成功,要么都失败
  • 一致性 Consistency。事务执行前后,数据库中的数据应该保持一致
  • 隔离性 Isolation。事务之间应该是隔离的,事务之间互不影响、干扰
  • 持久性 Durability。事务一旦提交,便会将修改持久化到数据库

 

 

事务管理的相关命令

start transaction;  #开始事务
sql语句1;
sql语句2;
.....

commit; #提交事务

#rollback; #回滚

代码100分

 

 

 

流程示例

start transaction;

insert into tb_user (name,age) values (“zhangsan”,20);  #显示Query OK,这条sql语句可以成功执行

insert into tb_user (name,age) values (“李四”,”age”);  #显示ERROR,发生错误。只是说这条语句执行错误,但后面还可以执行sql语句

insert into tb_user (name,age) values (“wangwu”,20);  #显示Query OK,

 

如果此时commit;提交,会把执行成功的2个sql语句做的修改持久化数据库,失败的sql语句则忽略。

 

其实发生ERROR时,为了做到事务的原子性,就应该rollback;回滚。

MySQL 事务管理「终于解决」

并不是说start transaction;  …..  commit;  会自动维持事务的4个特性,全部成功就持久化到数据库,某些sql语句发生错误,就自动回滚,不是这样的。

事务的4个特性需要我们自己来维持。

 

 

代码中使用事务也一样:

……   //开启事务

try{

  ….. //要执行的多条sql语句

      commit;  //若前面都正常执行,则提交

}catch(Exception e){

  rollback;  //发生错误就回滚

}

 

先开启事务,把要执行的多个sql语句放到try中,都正确执行那就提交,发生错误就回滚。

 

 


 

 

catch就是对异常的处理,既然捕获了异常进行了处理,就不会往上一级抛了。

如果每一级都是throws往上抛,抛到JVM,JVM默认的异常处理方式是:打印异常信息,终止程序运行。

 

比如说下面这段代码:

代码100分        System.out.println(1);
        try{
            System.out.println(1/0);
        }catch (Exception e){
            System.out.println("error");
        }
        System.out.println(2);

1
error
2

并不会自动在控制台打印异常信息,终止程序。

要看异常信息,可以在catch中 System.out.println(e.getMessage()); 打印出来

 

 


 

 

 

事务的并发

事务的并发即同时执行多个事务,主要涉及事务的隔离性、隔离级别。

 

1、事务并发执行可能出现的问题

(1)脏读     一个事务读取其它事务尚未提交的数据

事务B对数据库做了修改(执行成功但尚未提交),事务A读取这些已修改的记录,A读取之后,B进行了回滚,A读取到的数据变成了脏数据、无效数据,即脏读。

隔离级别 Read commited 已提交读,可解决脏读问题,等到使用这些记录的事务提交后才读取数据。

 

 

(2)不可重复读     前后多次读取,读取的数据内容不一致(期间进行了update操作)

比如说我卡里有2000,打算在ATM上取款2000,输入取款金额2000点击确定,系统查询账户余额,还有2000,是够的;

我老婆的微信绑定了我的卡,这时把我卡里的1000给花了,账户余额为1000

ATM执行扣款-2000(在账户余额的基础上扣,money-2000,又要获取账户余额),并往外吐钱2000,1000-2000=-1000

ATM前后2次读取余额(同一条记录的数据),读取的数据内容不一致,这就出现问题了。

 

隔离级别 Repeatable read 重复读,可解决不可重复读的问题,当有事务读了某些行的数据后,这些行会被锁住,不允许其它事务对这些行进行修改,这样重复读取到的数据就是一致的。

因为使用某些行时,这些行会被锁定,其它事务不能读取这些(可能会被修改的)行,也避免了脏读问题。

 

 

(3)幻读(虚读)   前后多次读取,读取的记录数不一致(期间进行了insert、delete操作)

隔离级别 Serializable 可解决幻读问题,不允许事务并发,最安全,但性能最差,基本不用。

 

以上3个是读问题,还可能产生一个写问题:丢失更新。

 

(4)丢失更新  丢失更新是不可重复读中的一种特殊情况,2个事务都要修改记录内容(update),后提交的覆盖了前面提交的

时间 取款事务 支票转账事务
T1 开始事务  
T2   开始事务
T3 查询账户余额为1000元  
T4   查询账户余额为1000元
T5 取出100,把存款余额改为900元  
T6 提交事务  
T7   汇入100元,把存款余额改为1100元
T8   提交事务

 

 

 

 

 

-100的更新操作丢失了。

 

 

2、4种隔离级别

  • Read uncommitted:未提交读,解决不了任何读问题,安全性最低,但事务执行效率最高
  • Read committed:已提交读,解决了脏读,但不可重复读、虚读有可能发生。oracle默认值。
  • Repeatable read:重复度,解决了脏读、不可重复读,但虚读有可能发生。mysql默认值。
  • Serializable:串行化,不允许事务并发,可解决所有并发问题,安全性最高,但事务执行效率最低

一般折中选择第2、3项,使用默认的即可,不必进行设置。

 

 

 

3、查看、设置隔离级别

代码100分
#mysql
5
select @@tx_isolation; #查看当前会话使用的隔离级别
select @@global.tx_isolation; #查看全局设置的隔离级别


#mysql 8
select @@transaction_isolation;
#查看当前会话使用的隔离级别
select @@global.transaction_isolation; #查看全局设置的隔离级别
#mysql5、mysql8的查看方式不同,5是tx,8是transaction,如果不对应会报错Unknown system variable "tx_isolation"|"transaction_isolation"


#设置事务的隔离级别,5、8一样
set session transaction isolation level repeatable read; #设置当期会话使用的隔离级别为repeatable read
set global transaction isolation level repeatable read; #设置全局使用的隔离级别是repeatable read

 

版权声明:本文内容由互联网用户自发贡献,该文观点仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 举报,一经查实,本站将立刻删除。
转载请注明出处: https://daima100.com/9633.html

(0)
上一篇 2023-02-04
下一篇 2023-02-04

相关推荐

  • Excel经典问题:提取字符串,一个案例涉及3种方法和10个函数「终于解决」

    Excel经典问题:提取字符串,一个案例涉及3种方法和10个函数「终于解决」堪称进阶Excel的集大成旗舰系列课《48天,Excel技能脱胎换骨》,试学之后才知道有多厉害……,点击下面卡片了解详情:有这样一个Excel经

    2023-03-01
    146
  • 连接 sql

    连接 sqljava连接sqlserver Spring中连接sqlserver C 连接sqlserver QT连接数据库

    2022-12-17
    141
  • Redis学习笔记(十) 客户端

    Redis学习笔记(十) 客户端Redis服务器是典型的一对多服务器程序:一个服务器可以与多个客户端建立网络连接,每个客户端可以向服务器发送命令请求,而服务器则接收并处理客户端发送的命令请求,并向客户端返回命令回复。 通过使用由I/

    2023-03-01
    159
  • Anaconda历史版本

    Anaconda历史版本作为数据科学家和Python开发者必备的一款工具,Anaconda拥有着众多的用户和高度的关注度。而随着科技的不断发展,Anaconda也在不断更新迭代,不同版本间的差异会对用户带来不同的使用体验。接下来本文将从多个方面详细介绍Anaconda的历史版本,带大家回顾、了解Anaconda的发展历程,以及各版本的新特性。

    2024-05-20
    64
  • Mongodb 使用YCSB性能压测「建议收藏」

    Mongodb 使用YCSB性能压测「建议收藏」一、背景 这几天对所有的基础组件做一个摸底的基准压力测试,目前我们所有的开源基础组件都没有做过性能测试,经常有开发人员问,我们的RDS、MongoDB集群能抗多大量呀,这个时候我是没办法回复的,因为…

    2023-01-26
    147
  • CSS align-items属性

    CSS align-items属性CSS中的align-items属性是一个非常重要的属性,它决定了一个容器(父元素)内所有的子元素在交叉轴上的对齐方式。了解align-items的使用方法和属性值可以帮助我们更好地布局页面并提高用户体验。

    2024-05-16
    74
  • MySQL数据库菜鸟教程(一)

    MySQL数据库菜鸟教程(一)1、MySQL安装?Windows系统:(解压文件)下载地址:https://dev.mysql.com/downloads/file/?id=496745?解压后进入文件夹,找到bin文件下两个可…

    2023-03-31
    165
  • Python Numpy库安装教程

    Python Numpy库安装教程Python是一种高级编程语言,广泛应用于数据分析、人工智能等领域。Numpy是Python中一个重要的科学计算库,提供了快速、高效的矩阵计算功能。

    2024-09-14
    27

发表回复

您的电子邮箱地址不会被公开。 必填项已用*标注