MySQL-事务

事务是一组操作的集合,他是一个不可分割的工作单位,事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求,这些操作要么同时成功,要么同时失败。

举个例子:张三要给李四转1000块钱,需要做的事有三件:1.查询张三账户余额。2.张三账户余额-1000。 3.李四账户余额加1000。这三件事要么同时成功,要么同时失败。

所以我们首先得在操作之前开启事务。操作完成后再提交事务。当代码中间抛出异常,我们可以回滚事务回到最初状态。

注意:

1.默认MySQL的事务事自动提交的,也就是说,当执行一条DML语句,MySQL会立即隐式的提交事务。

2.只有提交事务后表的内容才会真实刷新。

事务操作:

查看/设置事务提交方式

SELECT @@autocommit;

事务开启方式一: SET @@autocommit=0;//如果为1事自动提交,为0为手动提交。

事务开启方式二: START TRANSACTION;// 开启事务。

提交事务

COMMIT;

回滚事务

ROLBACK;

事务四大特性

**原子性:**事务是不可分隔的最小操作单元,要么全部成功,要么全部失败。

**一致性:**事务完成时,必须使所有数据都保持一致状态。

**隔离性:**数据库系统提供的隔离机制,保证事务在不受外部并发操作的独立环境下运行。

**持久性:**事务一旦提交或回滚,他对数据库中的数据的改变就是永久的。

并发事务问题:

**脏读:**一个事务读到另一个事务还没有提交的数据

演示:

我们首先打开两个命令行模拟两个客户端。登入一个账户:

数据库中有一张表,我们使用客户端1进行查询。

客户端2开启一个事务:

客户端2修改数据,并未提交事务:

客户端一再次查询:发现数据已经更改

**不可重复读:**一个事务先后读取同一条记录,但两次读取的数据不同,称之为不可重复读

客户端一,客户端二同时开启一个事务

客户端一进行数据查询

客户端二进行数据修改并提交事务

客户一再次查询:发现数据变更

**幻读:**一个事务按照条件查询时,但没有对应的数据行,但是在插入数据时,发现这行数据已经存在,好像出现了幻影。

客户端一,客户端二同时开启一个事务

客户端进行查询:查询记录没有结果

客户端2插入数据:

客户端二事务提交

客户端一插入数据:发现报错

客户端一再次查询数据:发现还是没有数据

事务隔离级别:能解决并发事务问题

从上至下性能逐渐降低,但安全性逐渐增强。

查看事务隔离级别:

SELECT @@TRANSACTION_ISOLATION;

设置事务隔离级别:

SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL 隔离级别;

注意:SESSION表示会话级别,表示仅对于当前客户端窗口有效。GLOBAL表示仅对于所有客户端窗口有效。

相关推荐
苹果醋339 分钟前
2020重新出发,MySql基础,MySql表数据操作
java·运维·spring boot·mysql·nginx
小蜗牛慢慢爬行40 分钟前
如何在 Spring Boot 微服务中设置和管理多个数据库
java·数据库·spring boot·后端·微服务·架构·hibernate
hanbarger44 分钟前
nosql,Redis,minio,elasticsearch
数据库·redis·nosql
微服务 spring cloud1 小时前
配置PostgreSQL用于集成测试的步骤
数据库·postgresql·集成测试
先睡1 小时前
MySQL的架构设计和设计模式
数据库·mysql·设计模式
弗罗里达老大爷1 小时前
Redis
数据库·redis·缓存
仰望大佬0072 小时前
Avalonia实例实战五:Carousel自动轮播图
数据库·microsoft·c#
学不透java不改名2 小时前
sqlalchemy连接dm8 get_columns BIGINT VARCHAR字段不显示
数据库
一只路过的猫咪2 小时前
thinkphp6使用MongoDB多个数据,聚合查询的坑
数据库·mongodb