Mysql-事务

事务概念及特性

Transaction Control Language 事务控制语言

事务:一个或一组SQL语句组成的一个执行单元,这个执行单元要么全部执行,要么全部不执行。如果单元中某条SQL语句执行失败或产生错误,整个单元将会回滚,即所有收到影响的数据将返回到事务开始以前的状态。

事务的ACID属性:

  1. 原子性(Atomicity)

    原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么不发生。

  2. 一致性(Consistency)

    事务必须使数据库从一个一致性状态变换到另外一个一致性状态。

  3. 隔离性(Isolation)

    事务的隔离性是指一个事物的执行不能被其他事物干扰,即一个事物内部的操作及使用的数据对并发的其他事物是隔离的,并发执行的各个事物之间不能相互干扰。

  4. 持久性(Durability)

    持久性是指一个事物一旦被提交,它对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。

事务的创建

隐式事务:事务没有明显的开启和结束的标记。例如:insert、update、delete语句。

显示事务:事务具有明显的开启和结束的标记。前提:必须先设置自动提交功能为禁用。

set autocommit=0;    #设置自动提交为禁用,并只针对当前会话有效

显示事务的使用步骤:

步骤一:开启事务

set autocommit=0;

start transaction; 可选的

步骤2:编写事务中的SQL语句(select insert update delete)

语句1;语句2;…

步骤3:结束事务

commit;提交事务

rollback;回滚事务

注:truncate 的删除不能回滚

隔离级别

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

  1. 脏读:对于两个事务A、B。A读取了已经被B更新但还没有被提交的字段,若B回滚,A读取的内容就是临时且无效的。(读到无效数据)
  2. 不可重复读:对于两个事务A、B。A读取了一个字段,然后B更新了该字段,A再次读取同一个字段,值就不同了。(读到相同字段,不同数据)
  3. 幻读:对于两个事务A、B。A从一个表中读取了一个字段,然后B在该表中插入了一些新的行,如果A再次读取同一个表,就会多出几行。

隔离级别:一个事物与其他事物隔离的程度称为隔离级别。

四种事物隔离级别:

隔离级别描述
READ UNCOMMITTED(读未提交数据)允许事物读取未被其他事物提交的变更。脏读、不可重复度和幻读的问题都会出现
READ COMMITTED(读已提交数据)只允许事物读取已经被其他事物提交的变更。可避免脏读,但不可重复读和幻读问题仍然可能出现
REPEATABLE READ(可重复读)确保事物可以多次从一个字段中读取相同的值。在这个事物持续期间,禁止其他事物对这个字段进行更新。可以避免脏读和不可重复读,但幻读的问题仍然存在
SERILIZABLE(串行化)确保事物可以从一个表中读取相同的行,在这个事物持续期间,禁止其他事物对该表执行插入、更新和删除才操作,三种都可解决,但性能十分低下。

注:MySQL支持四种事物隔离级别,且默认的隔离级别为:REPEATABLE READ。查看MySQL默认隔离级别:select @@tx_isolation;

在这里插入图片描述

设置当前MySQL链接的隔离级别:set session transaction isolation level 隔离级别;

在这里插入图片描述

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

  • set global transaction isolation level 隔离级别;

savepoint:设置保存点,搭配回滚使用

set autocommit=0;
start transaction;
sql语句1;
savepoint a;#设置回滚点
sql语句2;
rollback to a;#回滚到保存点
评论 2
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值