Mysql事务简单入门

一、事务介绍

基本介绍:

事务用于保证数据的一致性,它由一组相关的dml(update、delete、insert)语句组成,该组的dml语句要么全部成功,要么全部失败,比如:转账就需要事务来处理,用以保证数据的一致性

事务和锁:

当执行事务操作时(dml语句),mysql会在表上加锁,防止其他用户改表的数据,这对用户来讲非常重要

mysql数据库控制台事务的几个重要操作

  • start transaction 开始一个事务
  • savepoint 保存点名 —设置保存点
  • rollback to 保存点名 —退回事务
  • rollback ---- 回退全部事务
  • commit —提交事务,所有的操作生效,不能退回

细节:

1、没有设置保存点

2、多个保存点

3、存储引擎

4、开始事务方式

二、事务操作

事务操作示意图:
在这里插入图片描述
1、在 start transaction(开始事务)后,可在这过程中设置保存点,在没有 commit(提交事务)前都可 rollback to 回到保存点

2、设置保存点可以在某个时间段因为操作失误而进行 rollback(回退)到指定的保存点,假如在 保存点 a 到 保存点 b 中间因为 dml 失误或者想重新进行dml操作,就可进行 rollback to a ,回到 保存点 a,再重新进行dml操作

3、在 保存点 c 进行 rollback to a 后,不可再从 保存点 a rollback to b,也就是不能再 保存点 a 回退到 保存点 b

4、在 保存点 c 之后进行 commit(提交事务)操作后,不可再进行 rollback(回退)操作,所有保存点都已经被删除

测试sql

-- 测试表
create table t27(
	id int,
	`name` varchar(32)
)

-- 开始事务
start transaction

-- 设置保存点,保存点名字为a
savepoint a

-- 执行dml操作
insert into t27 values(100,'tom')
select * from t27

-- 设置保存点,保存点名字为b
savepoint b
insert into t27 values(100,'jack')
select * from t27

-- 回退到a保存点
rollback to b

-- 执行提交,提交事务后,保存点已经删除,不能回退
-- commit
commit

注意点

  • 回退事务

    在介绍回退事务前,先介绍保存点,保存点是事务中的点,用于取消部分事务,当结束事务时,会自动的删除该事务所定义的所有保存点,当执行回退事务时,通过指定保存点可以回退到指定的点

  • 提交事务

    使用 commit 语句可以提交事务,当执行了 commit 语句之后,会确认事务的变化、结束事务,删除保存点,释放锁,数据生效。当使用 commit 语句结束事务之后,其他会话【其他连接】将可以查到事务变化后的新数据

细节

1、如果不开始事务,默认情况下,dml操作是自动提交的,不能回滚

2、如果开始一个事务,没有创建保存点,可以执行 rollback ,默认回退到事务开始的状态

3、可以在这个事务中(还没提交时)创建多个保存点,比如:savepoint a,执行dml操作,savepoint b

4、可以在事务没有 commit(提交事务)前,选择回退到之前定义的某个保存点

5、mysql的事务机制需要 innodb 的存储引擎才可使用,myisam不支持

6、开始一个事务 start transaction(开启事务),或者 set autocommit=off(关闭自动提交)

三、事务的隔离级别

基本介绍:

1、多个连接开启各自事务操作数据库中数据时,数据库系统要负责隔离操作,以保证各个连接在获取数据时的准确性

2、如果不考虑隔离性,可能引发如下问题:

  • 脏读
  • 不可重复读
  • 幻读

1、脏读(dirty read)

当一个事务读取另一个事务尚未提交的修改时,产生脏读

2、不可重复读(nonrepeatable read)

同一查询在同一事务中多次进行,由于其他提交事务所做的修改或删除,每次返回不同的结果集,此时发生不可重复读

3、幻读(phantom read)

同一查询在同一事务中多次进行,由于其他提交事务所做的插入操作,每次返回不同的结果集,此时发生幻读

事务隔离级别

概念:Mysql隔离级别定义了事务与事务之间的隔离程度

Mysql隔离级别脏读不可重复读幻读加锁读
读未提交(Read uncommitted)不加锁
读已提交(Read committed)×不加锁
可重复读(Repeatable read)×××不加锁
可串行化(Serializable)×××加锁

说明: √ 是可能出现,× 不会出现

四、隔离级别介绍

1、显示隔离级别

-- 1、默认的隔离级别是可重复读的
mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

2、查看系统当前隔离级别

mysql> select @@global.tx_isolation;
+-----------------------+
| @@global.tx_isolation |
+-----------------------+
| REPEATABLE-READ       |
+-----------------------+

3、设置当前会话的隔离级别

-- 设置会话隔离级别
-- set session transaction isolation level 隔离级别
set session transaction isolation level Read uncommitted

4、设置当前系统的隔离级别

-- 设置系统隔离级别
-- set global transaction isolation level 隔离级别
set global transaction isolation level Read uncommitted

5、mysql默认的事务隔离级别是 repeatable read,一般情况下,没有特殊要求,没必要修改(因为该级别可以满足绝大部分项目需求)

6、全局修改,修改 my.ini 配置文件

-- 可选参数:READ-UNCOMMITTED、READ-COMMITTED、REPEATABLE-READ、SERIALIZABLE
[ mysqld ]
transaction-isolation = REPEATABLE-READ

修改完成后重启服务器

五、ACID

事务的acid特性

1、原子性(Atomicity)

原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生

2、一致性(Consistency)

事务必须使数据库从一个一致性状态变换到另一个一致性状态

3、隔离性(Isolation)

事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作数据所干扰,多个并发事务之间要相互隔离

4、持久性(Durability)

持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值