千家信息网

一些关于MySQL事务的基础知识

发表于:2025-01-21 作者:千家信息网编辑
千家信息网最后更新 2025年01月21日,下面讲讲关于MySQL事务的基础知识,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL事务的基础知识这篇文章你一定会有所受益。1、事务的基本语法
千家信息网最后更新 2025年01月21日一些关于MySQL事务的基础知识

下面讲讲关于MySQL事务的基础知识,文字的奥妙在于贴近主题相关。所以,闲话就不谈了,我们直接看下文吧,相信看完MySQL事务的基础知识这篇文章你一定会有所受益。

1、事务的基本语法

mysql> create table bank    -> (    -> name varchar(25),    -> money float    -> );Query OK, 0 rows affected (0.00 sec)mysql> insert into bank values('lu','1000'),('qi','5000');   Query OK, 2 rows affected (0.00 sec)Records: 2  Duplicates: 0  Warnings: 0mysql> begin;        Query OK, 0 rows affected (0.00 sec)mysql> update bank set money=money - 1000 where name='qi';Query OK, 1 row affected (0.00 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> update bank set money=money+1000 where name ='lu';Query OK, 1 row affected (0.00 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> select * from bank;            +------+-------+| name | money |+------+-------+| lu   |  2000 || qi   |  4000 |+------+-------+2 rows in set (0.00 sec)mysql> rollback;              Query OK, 0 rows affected (0.01 sec)mysql> select * from bank;           +------+-------+| name | money |+------+-------+| lu   |  1000 || qi   |  5000 |+------+-------+2 rows in set (0.00 sec)mysql> commit;            Query OK, 0 rows affected (0.00 sec)mysql> select * from bank;          +------+-------+| name | money |+------+-------+| lu   |  1000 || qi   |  5000 |+------+-------+2 rows in set (0.00 sec)

一个事务所涉及到的命令如下:

  • 事务开始:start transaction或begin;
  • 事务提交:commit
  • 回滚:rollback
查看自动提交模式是自动还是手动
mysql> show variables like 'AUTOCOMMIT';+---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit    | ON    |          +---------------+-------+1 row in set (0.01 sec)mysql> set AUTOCOMMIT=0;         mysql> show variables like 'AUTOCOMMIT';            +---------------+-------+| Variable_name | Value |+---------------+-------+| autocommit    | OFF   |+---------------+-------+1 row in set (0.00 sec)

2、事务的四种隔离级别

事务在提交之前对其他事务可不可见。

  1. read unaommitted(未提交读)
  2. read committed(已提交读)
  3. Repeatable read(可重复读)
  4. seaializable(可串行化)
1)未提交读

事务中修改没有提交对其他事务也是可见的,俗称脏读。

mysql> create table student    -> (    -> id int not null auto_increment,    -> name varchar(32) not null default '',    -> primary key(id)    -> )engine=InnoDB AUTO_INCREMENT=2 DEFAULT CHARSET=utf8;

接下来需要自行开启两个MySQL会话终端,A和B,并且都执行以下命令设置为未提交读。

mysql> set session tx_isolation='read-uncommitted';

客户端A:

mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from student;Empty set (0.00 sec)mysql> insert into student(name) values('zhangyi');
mysql> set session tx_isolation='read-uncommitted';        Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> select * from student;     +----+---------+| id | name    |+----+---------+|  2 | zhangyi |+----+---------+1 row in set (0.00 sec)

总结:以上可以看出未提交读隔离级别非常危险,对于一个没有提交事务所做修改对另一个事务是可见状态,出现了脏读!非特殊情况不建议使用此级别。

2)已提交读

多数数据库系统默认为此级别(MySQL不是)。已提交读级别为一个事务只能已提交事务所做的修改,也就是解决了未提交读的问题。

客户端A插入数据测试:

mysql> set session tx_isolation='read-committed';Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from student;+----+---------+| id | name    |+----+---------+|  2 | zhangyi |+----+---------+1 row in set (0.00 sec)mysql> insert into student(name) values('zhanger');Query OK, 1 row affected (0.00 sec)mysql> select * from student;+----+---------+| id | name    |+----+---------+|  2 | zhangyi ||  3 | zhanger |+----+---------+2 rows in set (0.00 sec)

客户端B查看(不会看到客户端A插入的数据):

mysql> select * from student;+----+---------+| id | name    |+----+---------+|  2 | zhangyi |+----+---------+1 row in set (0.00 sec)

客户端A进行提交:

mysql> commit;Query OK, 0 rows affected (0.01 sec)

客户端B进行查看(就可以看到A插入的数据了):

mysql> select * from student;+----+---------+| id | name    |+----+---------+|  2 | zhangyi ||  3 | zhanger |+----+---------+2 rows in set (0.00 sec)

总结:从上面可以看出,提交读没有了未提交读的问题,但是我们可以看到客户端A的一个事务中执行了两次同样的SELECT语句,得到不同的结果,因此已提交读又被称为不可重复读。同样的筛选条件可能得到不同的结果。

3)可重复读

可重复读解决了不可重复读的问题,数据库级别没有解决幻读的问题。

以下是客户端A和客户端B同时操作(都设置为可重复读,然后两边都开启一个事务):

mysql> set session tx_isolation='repeatable-read';Query OK, 0 rows affected, 1 warning (0.00 sec)mysql> begin;Query OK, 0 rows affected (0.00 sec)

客户端A:

mysql> select * from student;+----+---------+| id | name    |+----+---------+|  2 | zhangyi ||  3 | zhangsi |+----+---------+2 rows in set (0.00 sec)mysql> update student set name='zhanger' where id=3;Query OK, 1 row affected (0.01 sec)Rows matched: 1  Changed: 1  Warnings: 0mysql> commit;Query OK, 0 rows affected (0.00 sec)mysql> select * from student;           +----+---------+| id | name    |+----+---------+|  2 | zhangyi ||  3 | zhanger |+----+---------+2 rows in set (0.00 sec)

客户端B:

mysql> select * from student;+----+---------+| id | name    |+----+---------+|  2 | zhangyi ||  3 | zhangsi |+----+---------+2 rows in set (0.00 sec)mysql> commit;         Query OK, 0 rows affected (0.00 sec)mysql> select * from student;         +----+---------+| id | name    |+----+---------+|  2 | zhangyi ||  3 | zhanger |+----+---------+2 rows in set (0.00 sec)

总结:上面可以看出,可重复读两次读取的内容不一样。数据库的幻读问题并没有得到解决。幻读只读锁定里面的数据,不能读锁定外的数据,解决幻读出了mvcc机制Mvcc机制。

4)可串行化

是最高隔离级别,强制事务串行执行,执行串行了也就解决问题了,这个只有在对数据一致性要求非常严格并且没有并发的情况下使用。

在客户端A及客户端B进行以下操作(设置为可串行读):

mysql> set session tx_isolation='serializable';

客户端A:

mysql> begin;Query OK, 0 rows affected (0.00 sec)mysql> select * from student where id < 10;+----+---------+| id | name    |+----+---------+|  2 | zhangyi ||  3 | zhanger |+----+---------+2 rows in set (0.00 sec)

客户端B:

mysql> insert into student(name) values('zhangqi');ERROR 1205 (HY000): Lock wait timeout exceeded; try restarting transaction
以上几种的隔离级别对比如下:
隔离级别脏读不可重复幻读加锁读
未提交读
提交读
可重复读
串行读

对于以上MySQL事务的基础知识相关内容,大家还有什么不明白的地方吗?或者想要了解更多相关,可以继续关注我们的行业资讯板块。

事务 客户 客户端 数据 级别 问题 隔离 基础 基础知识 知识 事务所 数据库 不同 否否 内容 命令 情况 机制 结果 最高 数据库的安全要保护哪些东西 数据库安全各自的含义是什么 生产安全数据库录入 数据库的安全性及管理 数据库安全策略包含哪些 海淀数据库安全审计系统 建立农村房屋安全信息数据库 易用的数据库客户端支持安全管理 连接数据库失败ssl安全错误 数据库的锁怎样保障安全 太原悬挂式车路协同服务器 兴义数据库技术与应用 神经网络技术ppt 中国电科网络安全服务 软件开发培训签到表 学软件开发后做什么 返利机器人软件开发 做一个系统的数据库怎么建立 杨浦区企业软件开发服务价钱 未来之役换服务器端位也会改变 买东西超划算的软件开发人员 网络安全十六不准 笔记本服务器ip地址在哪查 网络安全大赛小组名字和口号 服务器如何添加一个管理员 服务器显卡好坏判断 瑞游网络技术有限公司 门头沟区网络软件开发要求 网络技术会计哪个好就业 自然语言数据库查询系统 虹口区多功能软件开发有哪些 中国官员数据库(COD) 嵌入式软件开发需求文档 网络安全宣传周日程 山东计算机网络技术专升本 网络技术方法 用什么技术连接数据库 物流系统数据库结构 周口精益管理软件开发 怎么给数据库字段添加自增
0