是什么

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

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

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

事务的特性

事务有四大特性:ACID

A:atomic

原子性,事务的整个操作是一个整体,不可分割,要么全部成功,要么全部失败

C:consistency

一致性,事务操作前后,数据表中的数据没有变化

I:isolation

隔离性,事务操作是互相隔离不受影响的

D:durability

持久性,数据一旦提交,不可改变,永久的改变数据表数据

事务的分类

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

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

操作

查看事务

sql

show variables like 'autocommit';

结果

mysql 查询是否开启事物 mysql查询会开启事务吗_隔离级别

操作

开启或关闭事务

sql

set autocommit = 0;

set autocommit = 1;

结果

mysql 查询是否开启事物 mysql查询会开启事务吗_隔离级别_02

事务的操作

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

结果

mysql 查询是否开启事物 mysql查询会开启事务吗_数据_03

解释

设置当前会话的事务隔离级别

sql

SET SESSION TRANSACTION ISOLATION LEVEL Read committed;

结果

mysql 查询是否开启事物 mysql查询会开启事务吗_mysql 查询是否开启事物_04

解释

设置全局的事务隔离级别

sql

SET GLOBALTRANSACTION ISOLATION LEVEL Read committed;

结果

mysql 查询是否开启事物 mysql查询会开启事务吗_mysql 查询是否开启事物_05

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