当前位置:网站首页>MySql事务

MySql事务

2022-08-11 08:30:00 指挥部在下面

事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。例如:在转账的由于网络等问题,你的账户是转出去了,但是对方没有收到。那么引进事务,就可以保证要么转成功,要么不转。

事务的使用

我们先创建一个账户表

 

1.开启事务:start transaction;

2.结束事务:commit;

3.回滚:rollback; -- 在事务的执行过程当中,mysql会记录每一步都执行了什么,一旦出现问题就可以根据记录回滚,进行复原。

 事务的4大特性

1.原子性:在计算机中原子性意味着不可再分,是事务的根本所在,能够把多个sql打包成一个整体,要么全部执行完,要么一个都不执行(执行出错,根据记录,自动回滚)。

2.一致性:事务执行前后,数据处在“一致”的状态(数据能对的上,合情合理)

3.持久性:事务进行的改动,都是写在硬盘上,不会随着程序重启/主机重启而丢失

4.隔离性(最复杂):多个事务,并发执行的时候,事务之间能够保持“隔离”,互不干扰。

详解隔离性

什么是并发执行?mysql本体是一个服务器,执行sql语句,本质是客户端把sql发给服务器去执行,事务也是一样的。同一时刻,多个客户端,都给服务器发了事务,如果这些并发执行的事务,操作的是不同的库,不同的表不会出现问题,但是如果是相同的数据库,相同的表,就会出现问题。这也是隔离存在的意义

1.脏读:一个事务A在修改数据,提交之前,另一个事务B读取了数据,后续A又修改了数据,此时事务B读到的就是“无效数据”

解决方案:对写操作进行加锁。即在A提交之前,不能读,提交之后才能读。

2.不可重复读:之前已经对写加锁,B在读的过程中,A又有了新的想法,对代码进行修改,再提交。B在读取的时候,代码又变了。即在一个事务A中,多次读取同一个数据,发现数据不一样(读的时候被人改了)。

解决方案:对读进行加锁,即B在读取数据的时候,A不去修改。

3.幻读:已经对读和写进行加锁了,但是在B读文件A 的时候,A去增加/修改其他文件(并没有影响到B读取数据)B读取的数据没有问题,但是发现结果集变了(第一次只有一个.java文件,下次读突然变成2个.java文件)

解决方案:“串行化”,B读取数据的时候A什么都不能做。

上述过程中,并发程度不断降低,效率变低;而隔离度不断提高,数据的准确性变高。

隔离级别

1.read uncommitted,允许读未提交的数据,并发程度最高,隔离程度最低,可能存在脏读/不可重复读/幻读

2.read committed,对写进行加锁,只能读提交之后的数据,并发程度降低,隔离程度提高,解决了脏读,可能存在不可重复读/幻读

3.repeatable read(mysql默认),对读写都加锁,并发程度再降低,隔离程度再提高,解决了脏读/不可重复读,可能存在幻读

4.serializable,严格执行串行化,并发程度最低,隔离程度最高,解决了脏读/不可重复读/幻读问题,效率最低

设置级别的地方:在mysql的配置文件my.ini进行设置

在以后的开发中需要根据不同需求场景,设置不同的挡位。平衡效率和准确性。

 

 

原网站

版权声明
本文为[指挥部在下面]所创,转载请带上原文链接,感谢
https://blog.csdn.net/weixin_61427900/article/details/126221561