mysql readonly事务_Mysql高手系列 - 第14篇:详解事务

这是Mysql系列第14篇。

环境:mysql5.7.25,cmd命令中进行演示。

开发过程中,会经常用到数据库事务,所以本章非常重要。

本篇内容

什么是事务,它有什么用?

事务的几个特性

事务常见操作指令详解

事务的隔离级别详解

脏读、不可重复读、可重复读、幻读详解

演示各种隔离级别产生的现象

关于隔离级别的选择

什么是事务?

数据库中的事务是指对数据库执行一批操作,这些操作最终要么全部执行成功,要么全部失败,不会存在部分成功的情况。

举个例子

比如A用户给B用户转账100操作,过程如下:

1.从A账户扣100

2.给B账户加100

如果在事务的支持下,上面最终只有2种结果:

操作成功:A账户减少100;B账户增加100

操作失败:A、B两个账户都没有发生变化

如果没有事务的支持,可能出现错:A账户减少了100,此时系统挂了,导致B账户没有加上100,而A账户凭空少了100。

事务的几个特性(ACID)

原子性(Atomicity)

事务的整个过程如原子操作一样,最终要么全部成功,或者全部失败,这个原子性是从最终结果来看的,从最终结果来看这个过程是不可分割的。

一致性(Consistency)

事务开始之前、执行中、执行完毕,这些时间点,多个人去观察事务操作的数据的时候,看到的数据都是一致的,比如在事务操作过程中,A连接看到的是100,那么B此时也去看的时候也是100,不会说AB看到的数据不一样,他们在某个时间点看到的数据是一致的。

隔离性(Isolation)

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

持久性(Durability)

一个事务一旦提交,他对数据库中数据的改变就应该是永久性的。当事务提交之后,数据会持久化到硬盘,修改是永久性的。

Mysql中事务操作

mysql中事务默认是隐式事务,执行insert、update、delete操作的时候,数据库自动开启事务、提交或回滚事务。

是否开启隐式事务是由变量autocommit控制的。

所以事务分为隐式事务和显式事务。

隐式事务

事务自动开启、提交或回滚,比如insert、update、delete语句,事务的开启、提交或回滚由mysql内部自动控制的。

查看变量autocommit是否开启了自动提交

mysql> show variables like 'autocommit';

+---------------+-------+

| Variable_name | Value |

+---------------+-------+

| autocommit | ON |

+---------------+-------+

1 row in set, 1 warning (0.00 sec)

autocommit为ON表示开启了自动提交。

显式事务

事务需要手动开启、提交或回滚,由开发者自己控制。

2种方式手动控制事务:

方式1:

语法:

//设置不自动提交事务

set autocommit=0;

//执行事务操作

commit|rollback;

示例1:提交事务操作,如下:

mysql> create table test1 (a int);

Query OK, 0 rows affected (0.01 sec)

mysql> select * from test1;

Empty set (0.00 sec)

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test1 values(1);

Query OK, 1 row affected (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test1;

+------+

| a |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

示例2:回滚事务操作,如下:

mysql> set autocommit=0;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test1 values(2);

Query OK, 1 row affected (0.00 sec)

mysql> rollback;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test1;

+------+

| a |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

可以看到上面数据回滚了。

我们把autocommit还原回去:

mysql> set autocommit=1;

Query OK, 0 rows affected (0.00 sec)

方式2:

语法:

start transaction;//开启事务

//执行事务操作

commit|rollback;

示例1:提交事务操作,如下:

mysql> select * from test1;

+------+

| a |

+------+

| 1 |

+------+

1 row in set (0.00 sec)

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> insert into test1 values (2);

Query OK, 1 row affected (0.00 sec)

mysql> insert into test1 values (3);

Query OK, 1 row affected (0.00 sec)

mysql> commit;

Query OK, 0 rows affected (0.00 sec)

mysql> select * from test1;

+------+

| a |

+------+

| 1 |

| 2 |

| 3 |

+------+

3 rows in set (0.00 sec)

上面成功插入了2条数据。

示例2:回滚事务操作,如下:

mysql> select * from test1;

+------+

| a |

+------+

| 1 |

| 2 |

| 3 |

+------+

3 rows in set (0.00 sec)

mysql> start transaction;

Query OK, 0 rows affected (0.00 sec)

mysql> delete from test1;

Query OK, 3 rows affected (0.00 sec)

mysql> rollback;

Query OK, 0

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

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

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

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值