14、mysql中事务的应用

版权声明:chaizepeng https://blog.csdn.net/chaizepeng/article/details/87883261

是什么

事务是一种保护连续操作同时满足(实现)的一种机制,用来保护数据的完整性,只适用于数据操作,不适用于结构操作,只有

innodb引擎的表具有事务安全的机制。就是说,在一个事务中做一系列的sql操作,当且仅当一系列sql都执行成功时,才会对数据

库的数据进行对应的持久化

事务的特性

事务有四大特性:ACID

A:atomic 原子性,事务的整个操作是一个整体,不可分割,要么全部成功,要么全部失败
C:consistency 一致性,事务操作前后,数据表中的数据没有变化
I:isolation 隔离性,事务操作是互相隔离不受影响的
D:durability 持久性,数据一旦提交,不可改变,永久的改变数据表数据

事务的分类

事务可分为自动事务和手动事务,mysql中默认是自动事务

事务通过autocommit变量控制,当autocommit = off/0 时表示手动事务,下边介绍一下查看自动事务是否开启和开启事务

操作 查看事务
sql show variables like 'autocommit';
结果
操作 开启或关闭事务
sql

set autocommit = 0;

set autocommit = 1;

结果

事务的操作

# 使用事务
-- 开启事务(系统将将要进行的操作不直接写入到数据表,而是现存在事务日志)
start transaction;

-- 执行对应的sql
update user set name = 'chaizepeng111' where id=5;
update card set card_number = '111111111' where id = 4;

-- 提交或者回滚
commit;

# 回滚点的设置
savepoint 回滚点名字;
savepoint a;

-- 回滚到指定的回滚点
rollback to a;

事务的原理

事务的实现借助的是一个临时的日志文件,当开始事务时,发送的sql会存储到日志文件中,存储到日志文件时执行sql,将结果

存储到日志文件,当查询时,会将返回的结果经过日志文件加工后再返回,当commit时,临时文件中的结果就会同步到数据库

中,而如果rollback时,则会删除临时文件,不做任何操作

事务的隔离级别

在并发环境下使用事务时,就可能产生问题,问题大致分为3类,如下:

脏读 事务A读到了事务B还未提交的数据
不可重复读 在一个事务里面读取了两次某个数据,读出来的数据不一致
幻读 在一个事务里面的操作中发现了未被操作的数据

为了解决以上问题,就出现了事务的隔离级别

DEFAULT 默认隔离级别
READ_UNCOMMITTED 读未提交,即能够读取到没有被提交的数据,一般不用
READ_COMMITED 读已提交,即能够读到那些已经提交的数据,可防止脏读,一般使用此隔离级别
REPEATABLE_READ 重复读取,即在数据读出来之后加锁,读取数据之后自动加锁,当前事务为结束之前,其他事务不可访问,解决了脏读、不可重复读的问题
SERLALIZABLE 串行化,最高的事务隔离级别,一个事务一个事务挨着执行,效率低,不用

介绍一下mysql下如何查看和设置事务的隔离级别

解释 查看事务的隔离级别
sql select @@tx_isolation;
结果
解释 设置当前会话的事务隔离级别
sql SET SESSION TRANSACTION ISOLATION LEVEL Read committed;
结果
解释 设置全局的事务隔离级别
sql SET GLOBALTRANSACTION ISOLATION LEVEL Read committed;
结果

补充:事务的隔离级别设置时的可选参数:Read uncommitted 、Read committed 、Repeatable read 、Serializable

猜你喜欢

转载自blog.csdn.net/chaizepeng/article/details/87883261
今日推荐