栏目分类:
子分类:
返回
文库吧用户登录
快速导航关闭
当前搜索
当前分类
子分类
实用工具
热门搜索
文库吧 > IT > 软件开发 > 后端开发 > Java

MySql事务

Java 更新时间: 发布时间: IT归档 最新发布 模块sitemap 名妆网 法律咨询 聚返吧 英语巴士网 伯小乐 网商动力

MySql事务

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

事务的使用

我们先创建一个账户表

 

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进行设置

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

 

 

转载请注明:文章转载自 www.wk8.com.cn
本文地址:https://www.wk8.com.cn/it/1039277.html
我们一直用心在做
关于我们 文章归档 网站地图 联系我们

版权所有 (c)2021-2022 wk8.com.cn

ICP备案号:晋ICP备2021003244-6号