是什么
事务是一种保护连续操作同时满足(实现)的一种机制,用来保护数据的完整性,只适用于数据操作,不适用于结构操作,只有
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