码迷,mamicode.com
首页 > 数据库 > 详细

MySQL事务和隔离级别

时间:2019-10-13 21:00:42      阅读:125      评论:0      收藏:0      [点我收藏+]

标签:问题   一致性   bank   varchar   sam   保护   开启   表示   rollback   

Mysql事务

避免事务,会占用内存

事务是啥?

简而言之:事务 - 就是保护多条执行的sql语句,要么全部成功,要么全部失败

比如:转账就是一个事务:从一个用户将资金转出,再将资金转入到另一个用户,这两个操作看做一体

事务是在哪个层实现的?

事务是引擎层实现的,mysql是多引擎的系统,不是所有引擎都支持事务的,比如MySQL原生的MyISAM就不支持事务,这也是MyIASM被InnoDB取代的原因之一。

事务ACID特性

  • 原子性:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
  • 一致性:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
  • 隔离性:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)。
  • 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。

事务隔离级别

依次解决上层的问题

读未提交(脏读):允许一个事务读取另外一个事务没有提交的数据。

技术图片

读提交(解决脏读可能出现的问题):指一个事务只能读取到另外一个事务已经提交的数据。

技术图片

可重复读:(解决可重复读可能出现的问题)当数据在另一事务操作中时,无法读取,只有当那个事务完成了,才能读取到数据。

技术图片

技术图片

技术图片

串行化(解决幻读):sql按顺序执行,不会出现问题,但是效率低。

MYSQL 事务处理主要有两种方法:

1、用 BEGIN, ROLLBACK, COMMIT来实现

  • BEGIN 开始一个事务
  • ROLLBACK 事务回滚
  • COMMIT 事务确认

2、直接用 SET 来改变 MySQL 的自动提交模式:

  • SET AUTOCOMMIT=0 禁止自动提交
  • SET AUTOCOMMIT=1 开启自动提交

案例

# mysql中事务的执行
create table bank(
    id int,
    name varchar(16),
    money decimal(65, 2)
);
insert into bank values(1, 'Tom', 10), (2, "Bob", 10);

# 假设出现以下执行情况

# 没有事务支持情况下,Tom的钱就丢了
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='ruakei';

# 将两条sql看做事务处理
# 开启事务
begin;
update bank set money=money-1 where name='Tom';
update bank set money=money+1 where name='ruakei';
# 确认无误,提交事务
commit;
# 确认有误,回滚
rollback;

参考博客:

https://blog.csdn.net/DorAction/article/details/87971378

MySQL事务和隔离级别

标签:问题   一致性   bank   varchar   sam   保护   开启   表示   rollback   

原文地址:https://www.cnblogs.com/zx125/p/11667960.html

(0)
(0)
   
举报
评论 一句话评论(0
登录后才能评论!
© 2014 mamicode.com 版权所有  联系我们:gaon5@hotmail.com
迷上了代码!