美文网首页
Mysql事务

Mysql事务

作者: 无昵称啊 | 来源:发表于2022-01-16 19:10 被阅读0次

仅InnoDB存储引擎支持事务

一、事务的ACID属性
  • 原子性(Atomicity)
    事务是一个不可分割的工作单元,事务中的操作要么都发生,要么都不发生
  • 一致性(Consistency)
    事务必须使一个一致性状态变换到另一个一致性状态
  • 隔离性(Isolation)
    一个事务的执行不能被其他事务干扰,并发执行的各个事物之间不能相互干扰
  • 持久性(Durability)
    事务一旦被提交,对数据库的改变就是永久性的,后续的操作或异常都不应该对其产生影响
二、事务的创建
  • 隐形事务
    事务没有明显的开启和结束的标记(比如insert、update、delete语句)
  • 显示事务
    事务具有明显的开启和结束的标记
    前提:必须先设置事务的自动提交功能为禁用 SET AUTOCOMMIT = 0;
    步骤1:开启事务
    SET AUTOCOMMIT= 0;
    START TRANSACTION;(可选)
    步骤2:编写事务中的SQL语句(select、insert、update、delete)
    语句1;
    ......
    步骤3:结束事务
    有两种结束事务的
    COMMIT;提交事务
    ROLLBACK;回滚事务
三、数据库的隔离级别

对于同时运行的多个事务,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:

  • 脏读(未提交的值变更):对于两个事务T1、T2,事务T1读取了已经被T2更新但还没有被提交的字段之后(事务T1未结束),事务T2执行了回滚(事务T2结束),事务T1读取的内容就是临时且无效的。
  • 不可重复读(提交的值变更):对于两个事务T1、T2,事务T1读取了一个字段(事务T1未结束),然后事务T2更新了这个字段之后(事务T2结束),T1再次读取同一个字段(事务T1仍未结束),值就不同了
  • 幻读(行变更):对于两个事务T1、T2,事务T1从一个表中读取了数据(事务T1未结束),然后事务T2在该表中插入了一些新的行(事务T2结束)。之后,如果T1再读取这个表(事务T1仍未结束),就会多出几行。
数据库提供的4种隔离级别
事务隔离级别 脏读 不可重复读 幻读 描述
读未提交(read uncommitted) 允许事务T1读取T1执行中其他事务T2未提交的值变更及行变更,脏读、不可重复读、幻读问题均会出现
不可重复读(read committed) 不允许事务T1未结束时,读取T1执行中其他事务T2未提交的值变更、未提交的行变更,不可重复读、幻读问题会出现
可重复读(repeatable read) 不允许事务T1未结束时,读取T1执行中其他事务T2已提交的值变更,幻读问题会出现
串行化(serializable) 不允许事务T1未结束时,读取T1执行中其他事务T2已提交的值\行变更

查询当前会话的事务隔离级别:

show variables like '%isolation%';

设置当前会话的事务隔离级别--不可重复读:

set session transaction isolation level read committed;

设置当前连接的事务隔离级别--可重复读:

set transaction isolation level repeatable read;

设置数据库系统全局事务隔离级别--串行化:

set global transaction isolation level serializable;
四、回滚点

设置回滚点

savepoint <回滚点名>

用法示例

set autocommit = 0;
start transaction;
delete from table1 where id = 1;
savepoint a;
delete from table2 where id = 1;
rollback to a;

相关文章

网友评论

      本文标题:Mysql事务

      本文链接:https://www.haomeiwen.com/subject/uwrxhrtx.html