mysql事务

一.事务概述

当多个用户同时请求修改某个数据时,通过事务可以保证数据从一个一致性状态变更为另外一个一致性的状态, 如A用户给B用户转10000元, 需要在A用户帐户中减少10000元,在B用户的帐户中增加10000元,这两个操作应该是一个原子操作,要么两个都修改成功,要么这两个操作都没发生.

在这里插入图片描述
在MySQl中,事务由单独单元的一条或者多条MySQL语句组成,在这个单元中,每条MySQL语句都是相互依赖的,而整个单元作为一个不可分割的整体,如果单元中一但某条SQL语句执行失败或者产生错误,整个单元将会回滚rollback,所有受到影响的数据将会回到事务开始以前的状态;如果单元中所有的SQL语句都成功执行commit,则事务被顺利执行。

事务可以保证多个操作原子性,要么全成功,要么全失败。对于数据库来说事务保证批量的DML要么全成功,要么全失败。

事务具有四个ACID特性:

1)原子性(Atomicity)
   把事务中所有的操作看作是一个整体,事务对数据的修改要么全部完全提交要么全部回滚
2)一致性(Consistency)
   在事务完成时,必须使所有的数据从一个一致性状态变更为另外一个一致性状态
3)隔离性(Isolation)
   一个事务中的操作语句对数据所做的修改必须与其他事务所做的修改相隔离.
4)持久性(Durability)
   在事务完成后,所做的修改是永久的

注意,在MySQL数据库中的InnoDB存储引擎支持事务, MyISAM不支持事务。

二:自动提交

在mysql中存在两个可以控制行为的变量,它们分别是autocommit和
transaction isolation level变量。

在mysql中如果不改变其自动提交变量,则系统会自动向数据库提交结果。如果用户希望通过控制mysql自动提交参数,可以改变提交的模式,则要通过autocommit变量来实现。

关闭自动提交的语法格式:

set autocommit=0;

在这里插入图片描述

查看当前自动提交状态:

select @@autocommit;

在这里插入图片描述

• 自动提交模式用于决定新事务如何及何时启动。

• 启用自动提交模式(默认状态mysql开启自动提交模式):

– 如果自动提交模式被启用,则单条DML语句将自动的开始一个新的事务。
– 如果该语句执行成功,事务将自动提交,并永久地保存该语句的执行结果。 – 如果语句执行失败,事务将自动回滚,并取消该语句的结果。
– 在自动提交模式下,仍可使用start transanction语句来显式地启动事务。这时,一个事务仍可包含多条语句,直到这些语句被统一提交或回滚。

• 禁用自动提交模式:

– 如果禁用自动提交,事务可以跨越多条语句。
– 在这种情况下,事务可以用COMMIT(提交事务)和ROLLBACK(回滚事务)语句来显式地提交或回滚多条语句。

• 自动提交模式可以通过服务器变量autocommit来控制。
•	例如:

默认情况下执行DML语句其实就是开启一个事务

mysql在默认的情况下是自动提DML语句的,只要执行一DML语句就提交一次;

关闭自动提交:start transaction;(等同于开启事务的意思)

关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没有任何意义),对于create、drop、alter这些无法回滚.事务只对DML语句有效果。

注意:提交事务:commit; 回滚事务rollback;

三:事务执行原理和执行步骤

在这里插入图片描述

创建事物的一般过程:

初始化事务、创建事务、应用SELECT语句查询数据是否被录入和提交事务 (如果用户不在数据库完成后执行事务提交,则系统会默认执行回滚操作。如果用户在提交事务前选择撤销事务,则用户撤销前的所有事务都将会被取消,数据库系统会回到初始状态)

事务执行步骤 :

1.关闭自动提交set autocommit=0;

关闭自动提交,首先声明初始化MySQL事务后所有的SQL语句为一个整体(原子性),然后在MySQL中应用start transaction;命令来标记一个事务的开始。

2.语法格式start transaction;   //开启事务

如果用户在输入以上代码之后,MySQL数据库没有给出警告和提示或者错误信息,则说明用户已经事务初始化成功。

3.执行相关的DML语句块:insert update delete

insert into temp values(“1”,“fa”);
update temp set value=‘2’ where id=1;
delete from temo where id=1;

4.回滚事务或者提交事务

在用户没有提交事物之前,事物的语句是属于还没有写入文件中的状态,属于在缓冲状态,此时的其他用户是查询不到相关的数据的。

提交事务语法commit;

事务回滚的语法rollback;

在这里插入图片描述

三: 事务隔离级别

1.事务并发的一些问题,因为数据库越安全就表示数据库的灵活性越低,有时候为了业务的需要,需要在数据库的安全和灵活性之间进行平衡,这时候就需要用到事务的隔离级别。

事务并发的一些问题

• 事务的隔离级别决定了事务之间可见的级别。
• 当多个客户端并发地访问同一个表时,可能出现下面的一致性问题:

(1)脏读取(Dirty Read)

一个事务开始读取了某行数据,但是另外一个事务已经更新了此数据但没有能够及时提交,这就出现了脏读取。

对于两个事务T1,T2,T1读取了已经被T2更新但还没有被提交提交的字段之后,若T2回滚,T1读取的内容就是临时且无效的。

(2)不可重复读(Non-repeatable Read)

在同一个事务中,同一个读操作对同一个数据的前后两次读取产生了不同的结果,这就是不可重复读。

对于两个事务T1和T2,T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一字段值就不同了。

(3)幻像读(Phantom Read)

幻像读是指在同一个事务中以前没有的行,由于其他事务的提交而出现的新行。

对于两个事务T1和T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后,如果T1再次读物同一个表,就会多出几行,造成前后读取的数据不一致。

数据库事务的隔离性:

数据库系统必须具有隔离并发运行各个事物的能力,使它们不会相互影响,避免各种并发问题。

一个事务和其他事务隔离的程度称为隔离级别:

数据库规定了多种事务隔离级别,不同隔离级别对应不同的干扰程度,隔离级别越高,数据以可执行就越好,但并发性就越弱。

2.隔离级别

不同的数据库对于隔离级别的划分也不同,mysql数据库知处四种隔离级别,Oracle数据库支持两种隔离级别。

在这里插入图片描述
InnoDB 实现了四个隔离级别,用以控制事务所做的修改,并将修改通告至其它并发的事务:

– 读未提交(READ UMCOMMITTED) 允许一个事务可以看到其他事务未提交的修改。

– 读已提交(READ COMMITTED) 允许一个事务只能看到其他事务已经提交的修改,未提交的修改是不可见的。

– 可重复读(REPEATABLE READ)
确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。 (银行总账)
该隔离级别为InnoDB的缺省设置。

– 串行化(SERIALIZABLE) 【序列化】 将一个事务与其他事务完全地隔离。

在这里插入图片描述

四.查看隔离级别

服务器变量tx_isolation(包括会话级和全局级两个变量)中保存着当前的会话隔离级别。为了查看当前隔离级别,可访问tx_isolation变量。

– 查看会话级的当前隔离级别:

mysql> SELECT @@tx_isolation;

mysql> SELEC @@session.tx_isolation;

– 查看全局级的隔离级别:

mysql> SELECT @@global.tx_isolation;

在这里插入图片描述
在这里插入图片描述

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值