MySql的事务(Transaction)

1、概述

在这里插入图片描述
一个事务由单独单元的一个或多个SQL语句组成,在这个单元中,每个MySQL语句是相互依赖的,一个事务是一个完整的业务逻辑单元,不可再分。
比如:银行账户转账,从A账户向B账户转账10000.需要执行两条update语句:

update t_act set balance = balance - 10000 where actno = 'act-001';
update t_act set balance = balance + 10000 where actno = 'act-002';

以上两条DML语句必须同时成功,或者同时失败,不允许出现一条成功,一条失败。
要想保证以上的两条DML语句同时成功或者同时失败,那么就需要使用数据库的“事务机制”。

2、和事务相关的语句只有:DML语句。(insert delete update)

为什么?因为它们这三个语句都是和数据库表当中的“数据”相关的。
事务的存在是为了保证数据的完整性,安全性。
假设所有的业务都能使用1条DML语句搞定,还需要事务机制吗?
不需要事务。

但实际情况不是这样的,通常一个“事儿(事务【业务】)”需要多条DML语句共同联合完成。

3、事务的特性?

事务包括四大特性:ACID

  • A: 原子性:事务是最小的工作单元,不可再分。
  • C: 一致性:事务必须保证多条DML语句同时成功或者同时失败。
  • I:隔离性:事务的隔离性是指一个事务的执行不能被其他事务干扰,即一个 事务内部的操作及使用的数据对并发的其他事务是隔离的,并发 执行的各个事务之间不能互相干扰。。
  • D:持久性:持久性是指一个事务一旦被提交,它对数据库中数据的改变就是 永久性的,接下来的其他操作和数据库故障不应该对其有任何影 响

4、事务的开始与结束

  • 当执行DML语句是其实就是开启一个事务
  • 以下面的其中之一作为结束
    COMMIT 或 ROLLBACK 语句
    DDL 或 DCL 语句(自动提交)
  • 用户会话正常结束 /系统异常终了

5、事务中存在一些概念:

事务(Transaction:一批操作(一组DML
开启事务(Start Transaction)
回滚事务(rollback)
提交事务(commit)
SET AUTOCOMMIT: 禁用或启用事务的自动提交模式
关于事务的回滚需要注意:只能回滚insert、delete和update语句,不能回滚select(回滚select没任何意义,对于create、drop、alter这些无法回滚.事务只对DML有效果

6、关于事务之间的隔离性

事务隔离性存在隔离级别,理论上隔离级别包括4个:
第一级别:读未提交(read uncommitted)
对于两个事务 T1, T2, T1 读取了已经被 T2 更新但还没有被提交的字段. 之后, 若 T2 回滚, T1读取的内容就是临时且无效的.
读未提交存在脏读(Dirty Read)现象:表示读到了脏的数据。
第二级别:读已提交(read committed)
对于两个事务T1, T2, T1 读取了一个字段, 然后 T2 更新了该字段. 之后, T1再次读取同一个字段, 值就不同
对方事务提交之后的数据我方可以读取到。
这种隔离级别解决了: 脏读现象没有了。
读已提交存在的问题是:不可重复读
第三级别:可重复读(repeatable read)
确保如果在一个事务中执行两次相同的SELECT语句,都能得到相同的结果,不管其他事务是否提交这些修改。
这种隔离级别解决了:不可重复读问题。
这种隔离级别存在的问题是:读取到的数据是幻象。
第四级别:序列化读/串行化读(serializable)
解决了所有问题。
效率低。需要事务排队。
Oracle 支持的 2 种事务隔离级别: READ COMMITED, SERIALIZABLE。 Oracle 默认的事务隔离级别为: READ COMMITED
Mysql 支持 4 种事务隔离级别. Mysql 默认的事务隔离级别 为: REPEATABLE READ

7、自动提交模式

mysql事务默认情况下是自动提交的
自动提交模式用于决定新事务如何及何时启动。
启用自动提交模式:

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

禁用自动提交模式:

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

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

mysql> SET AUTOCOMMIT = OFF; 
mysql> SET AUTOCOMMIT = ON; 
或
mysql> SET SESSION AUTOCOMMIT = OFF; 
mysql> SET SESSION AUTOCOMMIT = ON; 

show variables like ‘%auto%’; – 查看变量状态

8、演示事务

每启动一个 mysql 程序, 就会获得一个单独的数据库连接. 每 个数据库连接都有一个全局变量 @@tx_isolation, 表示当前的事务隔离级别.
查看当前的隔离级别: SELECT @@tx_isolation;
设置当前 mySQL 连接的隔离级别:

set  transaction isolation level read committed; //会话级:只对当前的会话效 

设置数据库系统的全局的隔离级别:

 set global transaction isolation level read committed;//全局级:对所的会话效 
  • 准备表:
    drop table if exists t_user;
    create table t_user(
    id int primary key auto_increment,
    username varchar(255)
    );
  • 演示:mysql中的事务是支持自动提交的,只要执行一条DML,则提交一次。
  • 演示:使用start transaction;关闭自动提交机制。
    mysql> start transaction;
  • 演示两个事务,假如隔离级别
    演示第1级别:读未提交
    set global transaction isolation level read uncommitted;
    演示第2级别:读已提交
    set global transaction isolation level read committed;
    演示第3级别:可重复读
    set global transaction isolation level repeatable read;
  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 3
    评论
评论 3
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值