mysql--事务

目录

概述

事务的ACID(acid)属性

事务的隔离级别


概述

TCL-->Transaction Comtrol Language 事务控制语言

事务: 一个或者一组sql语句组成一个执行单元,这个执行单元要么全部执行要么全部不执行.

如果单元中某条sql语句一旦执行失败或者产生错误那么整个单元将产生回滚,所受到影响的数据回到原来事务开始的状态,如果成功,则事务顺利执行

在mysql中用的最多的存储引擎有: innodb,myisam,momory 等;其中 innodb支持事务,而mysiam,momory等不支持事务

查询数据库的存储引擎

SHOW ENGINES

 

事务的ACID(acid)属性

  1. 原子性(Atomicity) 指的是事务是不可分割的,要么都成功,要么都失败
  2. 一致性(Consistency) 一个事务执行会使数据从一个一致性状态切换到另一个一致性状态,执行前后保证数据的完整性是一致的!
  3. 隔离性(Islation)  多个用户并发访问数据库要相互隔离!事务之间不能相互干扰;
  4. 持久性(Durability) 事务一旦被提交,这条记录才会被真正的修改,他对数据的改变是永久性的
# 开启事务
set autocommit=0;
START TRANSACTION;
语句1;
语句2;
# 提交
COMMIT;
# 回滚事务
ROLLBACK;

事务的隔离级别

同时运行多个事务,多个事务访问同一数据资源,如果没有采取必要的隔离级别,就会导致各种并发问题:

  • 脏读:针对修改;对于两个事务T1、T2  ,  T1  读取了被  T2  更新但是还没有被提交的数据后,若  T2  回滚,那么  T1  读取的内容就是临时且无效的;---事务2读取了事务1未提交的数据;
  • 不可重复读: 对于两个事务T1、T2,  T1读取了数据,然后 T2 更新了数据提交之后, T1再读取同一个字段,值就不同了;在同一个事物中多次查询未修改到的数据应该一致, ---事务2第一次读取的数据和第二次读取的数据因为事务1的修改导致不一致
  • 幻读: 针对新增;对于两个事务T1、T2, T1从表中读取一个数据,然后T2在该表中插入了一条数据,如果T1再次读取,同一个表,就会多出一行 -- 事务2第二次读取的数据因为事务1的新增操作比第一次读取得数据多了几条;

 

设置数据库隔离级别、mysql 支持4中隔离级别

 

mysql 5.7查询数据库默认使用的隔离级别

select @@tx_isolation;

mysql 8 中的查询数据库默认使用的隔离级别 

select @@transaction_isolation;

REPEATABLE READ: 可重复读取,可以确保事务从一个字段读取相同的值,在这个事务的持续期间,禁止其他事务对这个字段进行更新,可以避免脏读,和不可重复读,但幻读的问题仍然存在.

SET SESSION TRANSACTION  ISOLATION LEVEL  REPEATABLE READ;

READ UNCOMMTTED 读未提交 允许事务读取未被其他事物提交的变更,脏读,不可重复读和幻读的问题都会出现

SET SESSION TRANSACTION  ISOLATION LEVEL READ UNCOMMITTED;

READ COMMTED 读已提交数据 只允许事务读取已经被其他事务提交的变更,可避免脏读但是,不可重复读和幻读仍然可能出现

SET SESSION TRANSACTION  ISOLATION LEVEL READ COMMITTED;

SERIALIZABLE 串行化 确保事务可以从一个表中读取相同的行,在这个事务持续期间,禁止其他事务对该表执行插入,更新和删除操作,所有并发问题都能避免,但性能低下;

SET SESSION TRANSACTION  ISOLATION LEVEL SERIALIZABLE;


测试:

以管理员身份开启两个cmd命令行界面,连接同一个数据库

开启两个命令行模拟两个事务

 

设置为  READ UNCOMMTTED 读未提交

脏读不可重复读、幻读不可避免

设置为  READ COMMITTED 读以提交

避免了脏读,不可重复读和幻读,还是会出现;

 

REPEATABLE READ 可重复读取

避免了,脏读和不可重复读,幻读不能解决

 

幻读

 

 

SERIALIZABLE 串行化

 

删除操作

delete 支持事务的回滚;

TRUNCATE不支持事务的回滚;
 

 

 

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值