【数据库】-----03初识MySQL(事务)


一、什么是事务

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

二、事务的四大特性

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

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

隔离性:
  事务的执行不能被其他事务干扰,并发执行的各个事务之间不能相互干扰

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

三、事务的隔离级别

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

隔离级别是否允许脏读是否允许不可重复读是否允许幻读
read -uncommitted(读未提交数据)YYY
read- committed(读已提交数据)NYY
repeatable -read(可重复读)NNY
serializable(串行化)NNN

MySQL支持4种隔离级别,默认事务隔离级别为:repeatable -read

1、脏读
  事务A对数据库中数据进行了增、删或改,未提交事务。事务B可以读到事务A未提交的数据,如果事务A进行了回滚,那么事务B读到的这个数据就是脏数据

2、不可重复读
  事务A读取了一个字段后,事务B更新了该字段,当事务A再次读取该字段时该字段发生了变化,使得事务A两次读取相同字段,值不相同。

不可重复读关注点在数据更新和删除,通过行级锁可以实现可重复读的隔离级别。

3、幻读
  当事务A在读取某个范围内的记录时,事务B又在该范围内插入了新的记录,当事务A再次读取该范围的记录时,会产生幻行

  相对于不可重复读,幻读更关注其它事务的新增数据。通过行级锁可以避免不可重复读,但无法解决幻读的问题,想要解决幻读,只能通过Serializable隔离级别来实现

查看事务当前隔离级别

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

MySQL支持4种隔离级别,默认事务隔离级别为:repeatable -read

mysql> select @@tx_isolation;
+-----------------+
| @@tx_isolation  |
+-----------------+
| REPEATABLE-READ |
+-----------------+

设置当前mySQL连接的隔离级别

mysql> set session transaction isolation level read uncommitted;

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

mysql> set global transaction isolation level read uncommitted;

四、事务的创建

  MySQL默认操作模式为自动提交模式,除非显示的开启一个事务,否则每个查询都被当成一个单独的事务自动执行。可以通过设置autocommit的值改变默认的提交模式。

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

步骤1:开启事务
set autocommit=0;
start transaction;(可写可不写)
步骤2:编写事务中的SQL语句(增、删、改、查)
语句1;
语句2;
……
步骤3:结束事务(选其一)

commit;提交事务
rollback;回滚事务

添加保存点:
  savepoint 节点名;设置保存点,只搭配(ROLLBACK TO 节点名;)使用

SET autocommit=0;
START TRANSACTION;
DELETE FROM account WHERE id=25;#删了
SAVEPOINT d;#设置保存点
DELETE FROM account WHERE id=52;#没删
ROLLBACK TO d;#回滚到保存点

隐式事务
  事务没有明显的开启和结束的标记

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值