MySQL学习笔记进阶篇(九)之事务

事务在我们做较为复杂的项目时都会用到,无论用什么数据库都会用到事务处理。MySQL 事务主要用于处理操作量大,复杂度高的数据。

事务的一些介绍:

事务是指逻辑上的一组操作,组成这组操作的各个单元,要不全成功要不全失败。
   - 支持连续SQL的集体成功或集体撤销。
   - 事务是数据库的一个功能。
   - MySQL需要利用 InnoDB 或 BDB 存储引擎,对自动提交的特性支持完成。
   - InnoDB被称为事务安全型引擎。

事务的特性:

 1. 原子性(Atomicity)
       事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
   2. 一致性(Consistency)
       事务前后数据的完整性必须保持一致。
       - 事务开始和结束时,外部数据一致
       - 在整个事务过程中,操作是连续的
   3. 隔离性(Isolation)
       多个用户并发访问数据库时,一个用户的事务不能被其它用户的事物所干扰,多个并发事务之间的数据要相互隔离。
   4. 持久性(Durability)
       一个事务一旦被提交,它对数据库中的数据改变就是永久性的。

MySQL中事务的注意事项:

   1. 数据定义语言(DDL)语句不能被回滚,比如创建或取消数据库的语句,和创建、取消或更改表或存储的子程序的语句。
   2. 事务不能被嵌套。

MySQL事务的执行要求:

   1. 要求是事务支持的表类型
   2. 执行一组相关的操作前要开启事务
   3. 整组操作完成后,都成功,则提交;如果存在失败,选择回滚,则会回到事务开始的备份点。

事务开启

START TRANSACTION; 或者 BEGIN;
   开启事务后,所有被执行的SQL语句均被认作当前事务内的SQL语句。

事务提交

COMMIT;

事务回滚

   ROLLBACK;

演示执行事务

--开启事务
begin;
insert into stu(sname,sage,sgender,stuinfo,cid) values('peter',22,'male','hello i am peter',1),('alice',22,'female','hello i am alice',1),('sam',23,'male','hello i am sam',2);
--提交事务
commit;

演示事务回滚

--开启事务
begin;
insert into stu(sname,sage,sgender,stuinfo,cid) values('peter',22,'male','hello i am peter',1),('alice',22,'female','hello i am alice',1),('sam',23,'male','hello i am sam',2);
--回滚事务
rollback;

由于事务回滚了,所以在开启事务之后执行的语句都相当于撤回了,所以演示的时候查询回滚的数据会出错。

当然我们还可以设置一个事务回滚的标记点。

保存点

SAVEPOINT 保存点名称 -- 设置一个事务保存点
   ROLLBACK TO SAVEPOINT 保存点名称 -- 回滚到保存点
   RELEASE SAVEPOINT 保存点名称 -- 删除保存点

我们还可以设置自动提交事务。

InnoDB自动提交特性设置

   SET autocommit = 0|1;   0表示关闭自动提交,1表示开启自动提交。
   - 如果关闭了,那普通操作的结果对其他客户端也不可见,需要commit提交后才能持久化数据操作。
   - 也可以关闭自动提交来开启事务。但与START TRANSACTION不同的是,
     SET autocommit是永久改变服务器的设置,直到下次再次修改该设置。(针对当前连接)
     而START TRANSACTION记录开启前的状态,而一旦事务提交或回滚后就需要再次开启事务。(针对当前事务)

 事务的并发

事务的并发问题涉及以下几种情况

1.脏读

      能够看到其他用户还没有提交的数据

2.不可重复度

      两个用户发出相同的查询,却返回了不同的数据

3.幻读

事务的隔离级别

隔离级别脏读不可重复度幻读说明
read-uncommitted一个事务可以读取另一个未提交事务的数据
read-committed×一个事务要等待另一个事务提交后才能读取数据
repeatable-read××当开启读取数据时(事务已开启),不允许修改数据
serializable×××

事务串行化执行,都可避免,但性能最低。不建议使用。

查看隔离级别

mysql> select @@global.tx_isolation,@@tx_isolation;
+-----------------------+-----------------+
| @@global.tx_isolation | @@tx_isolation  |
+-----------------------+-----------------+
| REPEATABLE-READ       | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.01 sec)

设置隔离级别

set global transaction isolation level 隔离级别

set session transaction isolation level 隔离级别

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值