关于数据库:MySQL事务学习笔记一-初遇篇

2次阅读

共计 1899 个字符,预计需要花费 5 分钟才能阅读完成。

如何开启事务

在《数据库事务概论》中咱们曾经探讨了事务的基本概念、性质,那么在 MySQL 中如何将一系列操作当做一个事务呢。像上面这样:

BEGIN;  // 代表开启事务

UPDATE  Student SET name = '张三三' WHERE id = '1';

COMMIT; // 代表将 BEGIN 和 COMMIT 之间的语句进行提交, 也就是申请 MySQL 将后果刷新到磁盘上

如果只有 BEGIN,没有 COMMIT,那么代表 BEGIN 上面对数据的操作还未刷到磁盘上, 代表该事务处于局部提交的状态,在事务隔离级别为不可重读的状况下,其余 Session 无奈读到了这个更新,通过:

 SHOW VARIABLES LIKE 'transaction_isolation';

能够查看 MySQL 中事务默认的隔离级别:

能够看到以后我的数据库的隔离级别是可反复读,在这种状况下其余 Session 是无奈读到这个处于未提交状态的事务的更新的,咱们来验证一下:

当初咱们再开启一个 Session,也就是再开一个命令列界面,看能不能查问到上图对应 Session 的更新。

能够看到 name 还是张三三,当初咱们执行 Commit 指令,提交事务,等价于申请 MySQL 将事务所做的扭转刷新到磁盘上。而后看下另一个 Session 是否能查问到。

主动提交

可能有同学会问,我平时间接执行单条 UPDATE 语句,在别的 Session 中间接能查问到,那是不是不加 UPDATE 语句就不算事务了啊,那要不然为啥我执行了 UPDATE,其余 Session 立即能查问到呢? 像上面这样:

如果咱们不显式的应用 BEGIN 或 START TRANSACTION(比 BEGIN 更全面)来开启一个事务,那么每个 DML 语句 (INSERT,UPDATE,DELETE) 都算是一个独立的事务,主动提交,这种个性咱们称之为事务的主动提交,在 MySQL 中能够通过:

SHOW VARIABLES LIKE 'autocommit';

查看该个性是否开启:

隐式提交

如果咱们不想用主动提交能够用 BGEIN 和 COMMIT 语句来手动提交,或者将 autocommit 敞开,然而即便咱们应用了 BGEIN,也不能百分之百的保障 MySQL 不会主动提交,在以下状况下:

  • 如果 BEGIN 后跟了 DDL 语句(定义或批改数据库对象的数据定义语言 ,Data definition language)
  • 隐式应用或批改 mysql(这个是 MySQL 自带的数据库,就叫 mysql)数据库中的表
  • 事务管制或对于锁定的语句(BEGIN 前面又来了个 BEGIN 或者 START TRANSACTION)
  • 或者在以后 Session 中关上 autocommit 的开关
  • 或者应用 LOCK TABLE、UNLOCK TABLES 等对于锁定的语句也会隐式的提交前边语句所属的事务
  • 加载数据的语句, 比方咱们应用 LOAD DATA 语句来批量往数据库中带入数据时,也会隐式的提交后面语句所属的事务
  • MySQL 复制的一些语句,应用 START SLAVE,STOP SLAVE、RESET SLAVE 等语句时也会触发隐式提交
  • ANALYZE TABLE [表名]、CACHE INDEX、CHECK TABLE [表名] 等语句也会触发前边语句所属的事务。

手动停止事务

那如果产生了意外,我想回滚或者手动停止事务呢,咱们能够借助 RollBack 指令,像上面这样:

这里须要强调的是,ROLLBACK 语句是 MySQL 用来须要手动的回滚事务时提供的语句,如果 MySQL 的事务在执行过程中遇到了某些谬误而无奈继续执行的时候,事务会主动的进行回滚。

保留点

如果咱们在 Begin 之后,执行了好多条 UPDATE 语句呢,咱们只想回滚到某个点,再接着执行呢,请保留点同志出场谈话,在事务对应的语句受骗上几个点,调用 ROLLBACK 语句的时候,咱们就能回滚到咱们想回滚的点了。示例如下:

语法示例:

SAVEPOINT 保留点名称  // 产生保留点
RELEASE SAVEPOINT 保留点名称 // 删除保留点

另一种开启事务的形式

下面咱们都是采取 BEGIN 语句来开启事务的,MySQL 中还有另一种开启事务的语法:

START TRANSACTION [修饰符],[修饰符],[修饰符];

START TRANSACTION 绝对于 BEGIN 语句的不同之处就在于,START TRANCATION 能够跟修饰符, 如下所示:

  • READ ONLY (只读模式)

在该模式下只容许读数据,不容许写永恒表的数据,能够写长期表的数据,长期表只存在于以后会话。

示例:

  • WRITE ONLY 只写模式
  • WITH CONSISTENT SNAPSHOT 一致性读。

一个事务的模式是不能即便只读模式,又是只写模式,咱们不加批改默认就是既容许读又容许读。

正文完
 0