文章目录
事务基本介绍与使用
事务用于保证数据的一致性,它由一组相关的dml(增删改)语句组成,该组的dml语句要么全部成功,要么全部失败。如:转账就要用事务来处理,用以保证数据的一致性。
回退事务
在介绍回退事务前,先介绍一下保存点(savepoint).保存点是事务中的点.用于取消部分事务,当结束事务时(commit),会自动的删除该事务所定义的所有保存点.当执行回退事务时,通过指定保存点可以回退到指定的点
提交事务
使用commit语句可以提交事务.当执行了commit语句子后,会确认事务的变化、结束事务、删除保存点、释放锁,数据生效。当使用commit语句结束事务子后,其它会话【其他链接】将可以查着到事务变化后的新数据【所有数据就正式生效】
思路图解析(图)
事务和锁
当执行事务操作时(dml语句),mysql会在表上加锁,放置其他用户改表的数据。这对用户来讲是非常重要的
基本操作
mysql数据库控制台事务的几个重要操作
- start transaction --开始一个事务
- savepoint 保存点名 --设置保存点
- rollback to 保存点名 --回退事务
- rollback --回退全部事务
- commit --提交事务,所有的操作生效,不能回退
事务操作(图)
代码模拟
-- 演示
-- 1.创建一张测试表
create table t1
(id int,
`name` varchar(32));
-- 2.开启事务
start transaction;
-- 3.设置保存点
savepoint a;
-- 执行dml操作
insert into t1 values(100,'tom');
select * from t1;
-- 设置保存点2
savepoint b;
-- 执行dml操作
insert into t1 values(200,'jack');
select * from t1;
-- 回滚到b
rollback to b;
-- 回滚到 a
rollback to a;
select * from t1;
-- 回退到事务开始状态
rollback;
-- 所有事务生效,commit,则不能回滚
commit;
细节
- 如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚
- 如果开始一个事务,你没有创建保存点,你可以执行 rollback,默认就是回退到你事务开始的状态
-- 如果开始一个事务,你没有创建保存点,你可以执行rollback
-- 默认就是回退到你事务开始的状态
start transaction;
insert into t1 values(100,'taotao');
insert into t1 values(200,'guiugi');
-- 回退
ROLLBACK;
select * from t1;
-
你也可以在这个事务中(还没有提交时),创建多个保存点,比如:savepoint aaa;执行dml,save point bbb;
-
你可以在事务没有提交前,选择回退到哪个保存点
-
mysql的事务没有提交前,选择回退到哪个保存点
-
开始一个事务start transaction,set autocommit = off;
start transaction;
-- 或者
set autocommit = off;
- InnoDB 存储引擎支持事务,MyISAM不支持
MySQL事务隔离级别
概念
Mysql隔离级别定义了事务与事务之间的隔离程度
隔离级别介绍
- 多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性
- 如果不考虑隔离性,可能会引发如下问题:
脏读(dirty read)
当一个事务读取另一个事务尚未提交的修改时,产生脏读
不可重复读(nonrepeatable read)
同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读
幻读(phantom read)
同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读
4种事务隔离级别(表格)
Mysql隔离级别(4种) | 脏读 | 不可重复读 | 幻读 | 加锁读 |
---|---|---|---|---|
读未提交(read uncommitted) | √ | √ | √ | 不加锁 |
读已提交(read committed) | × | √ | √ | 不加锁 |
可重复读(Repeatable read) | × | × | × | 不加锁 |
可串行化(Serializable)【演示重开客户端】 | × | × | × | 加锁 |
√表示可能出现,x表示不会出现
案例演示
-- 演示mysql的事务隔离级别
-- 1.开了两个mysql的控制台
-- 2.查看当前mysql的隔离级别
-- select @@tx_isolation;
-- mysql > select @@tx_isolation;
select @@tx_isolation;
-- +-----------------+
-- | @@tx_isolation |
-- +-----------------+
-- | REPEATABLE-READ |
-- +-----------------+
-- 3.把其中一个控制台的隔离级别设置 Read uncommitted
set session transaction isolation level read uncommitted;
-- +------------------+
-- | @@tx_isolation |
-- +------------------+
-- | READ-UNCOMMITTED |
-- +------------------+
-- 4.创建表
create table `account`(
id int,
`name` varchar(32),
money int);
)
-- 5.更改为“读已提交”
set session transaction isolation level read committed;
-- 6.更改为“可重复读”
set session transaction isolation level repeatable read;
-- 7.更改为“可串行化”
set session transaction isolation level serializable;
读未提交(产生脏读)
数据紊乱
读已提交(未产生脏读)
读已提交(产生幻读)
可重复读(什么都不产生)
当我测试端提交事务后,方可查询到
可串行化(锁)
注意
- 事务隔离只限制事务开启时查询,当事务提交后不在有隔离级别
1.查看当前会话隔离级别
- 这是8.0之前的版本语句
select @@tx_isolation;
- 8.0之后用
select @@transaction_islation;
2.查看系统当前隔离级别
- 这是8.0之前的版本语句
select @@global.tx_isolation;
- 8.0之后用
select @@global.transaction_islation;
3.设置当前会话隔离级别
set session transaction isolation level repeatable read;
4.设置系统当前隔离级别
set global transaction isolation level repeatable read;
5.Mysql默认的事务隔离级别
repeattable read,一般情况下,没有特殊要求,没有必要修改(因为该级别可以满足绝大部分项目需求)
默认隔离级别修改
全局修改,修改my.ini配置文件,在最后加上
-- 可选参数有:read-uncommitted,read-committed,repeatable-read,serializable
[mysqld]
transaction-isolation = repeatable-read
事务的ACID特性(了解)
1.原子性(Atomicity)
原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生
2.一致性(Consistency)
事务必须使数据库从一个一致性状态变换到另外一个一致性状态
3.隔离性(lsolation)
事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离
4.持久性(Durability)
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据发生故障也不应该对其有任何影响