Mysql——TCL(事务控制)

一、事务的概念
 事务是由一条或多条SQL语句组成的一个执行单元,这个单元作为一个不可分割的执行整体,要么全部执行成功,要么全部执行失败。若其中有一条执行失败则事务会回滚到事务开始之前的状态。
 事务有四个属性(ACID):原子性、一致性、隔离性、持久性
  1、原子性(Atomicity):指事务是一个不可分割的整体,事务中的操作要么都执行,要么都不执行。
  2、一致性(Consistency):事务必须是数据库从一个一致性状态变为另一个一致性状态。
  3、隔离性(Isolation):指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及其使用的数据对并发的其他事务是隔离的,并发执行的各个事务之前不能相互干扰。这个在高并发环境下尤为重要,事务隔离的程度跟选择的隔离级别有很大关系。
  4、持久性:一个事务一旦提交,对数据库中数据的改变就是永久性的。
Tip:事务仅对数据的增删改操作有效,对于表的定义、表结构的变化等是没有事务的概念的。

二、存储引擎和事务
 存储引擎是指数据存储时使用的不同的技术,并不是所有的存储引擎都支持事务,Mysql中常用的存储引擎中只有InnoDB是支持事务的,MyIsam和Memory则不支持事务。
 Mysql中查看存储引擎的方式:

show engines;

在这里插入图片描述
三、事务的分类
 事务有隐式事务和显示事务之分,区别在于有没有显式的事务开启和结束标记。
 默认的INSERT、UPDATE、DELETE语句都是会自动提交的,事务提交后是不能够回滚的。这跟数据库的autocommit属性的设置有关,默认情况下都是开启自动提交的。可通过SHOW VARIABLES;查看数据库的属性设置:
在这里插入图片描述
 隐式事务举例:默认情况下的增删改

DELETE FROM table_a WHERE id = 1;

 显示事务:在开启显示事务之前一定要关闭事务的自动提交

#关闭事务的自动提交
SET autocommit = 0;#该语句仅对当前事务有效

 显示事务举例:具有明显的事物开启和结束标记,事务结束要么提交要么回滚

#开启事务
SET autocommit = 0;#有了这句代码就会开启事务
START TRANSACTION;#这句代码可省略
#事务的执行语句
UPDATE account
SET balance = 500
WHERE
	username = '张无忌';
UPDATE account
SET balance = 1500
WHERE
	username = '赵敏';
#事务提交
COMMIT;
#ROLLBACK;#事务回滚

四、事务的隔离级别
 对于并发运行的多个事务,当这些事务访问相同的数据时,如果没有采取必要的隔离机制,就会导致各种并发问题:
 1、脏读:对于两个事务T1、T2,T1读取了已经被T2更新但还没有提交的数据之后,T2回滚了,则T1读取的数据就是无效的,这就是脏读。
 2、不可重复读:对于两个事务T1、T2,T1读取数据后,T2更新了T1读取的数据,此时T1再次读取该数据时会和前一次不一样,这称为不可重复读。
 3、幻读:对于两个事物T1、T2,T1读取一个表中的数据后,T2向该表中插入了新的数据,T1再次读取这个表时发现多出了新的数据,这称为幻读。

 事务的隔离级别:一个事务与其他事务隔离的程度称为隔离级别,数据库中有多种隔离级别,不同的隔离级别对应不同的干扰程度,隔离级别越高,数据一致性就越好,但并发性越弱。
 数据库的4种事务隔离级别:

隔离级别描述问题
READ UNCOMMITTED(读未提交)允许事务读取其他事务未提交的变更脏读、不可重复读、幻读的问题都会出现
READ COMMITTED(读已提交)只允许事务读取其他事务已提交的变更可以避免脏读,但不可重复读和幻读问题仍会出现
REPEATABLE READ(可重复读)确保事务多次读取同一个字段时数据是前后一致的,在这个事务持续期间,禁止其他事务对这个字段进行更改可以避免脏读和不可重复读,但幻读问题仍然存在
SERIALIZABLE(串行化)在一个事务读取一个表的数据时,禁止其他事务对该表执行插入、更新、删除操作所有并发问题都可以避免,但是性能低下

Tip
  1️⃣可重复读是行锁,行锁只能保证事务中被操作的数据行不能被其他事务修改,但是无法保证其他事务向该表中插入新数据,因此无法解决幻读的问题;串行化则是表锁,表锁是说在一个事务中一旦操作了某个表,则在该事务提交或回滚之前所有对该表的增删改查操作都将等待,因此可以解决幻读的问题,但是效率低下。
  2️⃣Oracle支持READ COMMITTED和SERIALIZABLE两种隔离级别,默认为READ COMMITTED;Mysql支持上述4中事务隔离级别,默认为REPEATABLE READ(可重复读)
 查看隔离级别:

SELECT @@tx_isolation;

 设置隔离级别:

#设置当前连接的隔离级别:SESSION可以省略
SET [SESSION] TRANSACTION ISOLATION LEVEL 隔离级别;
#设置全局的隔离级别
SET GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;

五、事务的保存点
 事务的保存点(SAVEPIONT)其实就是指定事务可回滚到的一个节点,有时我们并不一定要将整个事务的所有操作都进行回滚,而是只回滚该事务中的某一部分操作,这个时候就需要用到事务的保存点,一个事务中可以有多个保存点,多个保存点间根据名称区分。

SET autocommit = 0;
START TRANSACTION;
DELETE FROM account WHERE id = 2;
SAVEPOINT a; #设置一个保存点
DELETE FROM account WHERE id = 3;
ROLLBACK TO a; #回滚到a保存点
  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值