作者:小伊果果_679 | 来源:互联网 | 2023-08-23 13:24
MySQL事务小结文章目录MySQL事务小结1.事务日志的配置项2.ACID测试3.事务控制语句4.MYSQL事务处理主要有两种方法5.事务隔离MVCC和事务的隔离级别
MySQL事务小结
文章目录 MySQL事务小结 1.事务日志的配置项 2.ACID测试 3.事务控制语句 4.MYSQL 事务处理主要有两种方法 5.事务隔离 MVCC和事务的隔离级别: 指定事务隔离级别: 6.事务回滚案例
MySQL 事务主要用于处理操作量大,复杂度高的数据。 比如说:在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!- 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。- 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。- 事务用来管理 insert , update , delete 语句
1.事务日志的配置项 innodb_log_files_in_group innodb_log_group_home_dir innodb_log_file_size innodb_mirrored_log_groups
2.ACID测试 一般来说,事务是必须满足4 个条件(ACID测试):原子性(Atomicity,或称不可分割性)一致性(Consistency)隔离性(Isolation ,又称独立性) 离级别,实现并发持久性(Durability)
Transaction生命周期
一个事务(transaction )中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。 事务在执行过程中发生错误,会被回滚(Rollback )到事务开始前的状态,就像这个事务从来没有执行过一样。
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。 这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。 事务隔离分为不同级别,包括读未提交(Read uncommitted )读提交(read committed )可重复读(repeatable read )串行化(Serializable )
事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
3.事务控制语句 BEGIN 或 START TRANSACTION 显式地开启一个事务;
COMMIT 也可以使用 COMMIT WORK,不过二者是等价的。COMMIT 会提交事务,并使已对数据库进行的所有修改成为永久性的;
ROLLBACK 也可以使用 ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier,SAVEPOINT 允许在事务中创建一个保存点,一个事务中可以有多个 SAVEPOINT;
RELEASE SAVEPOINT identifier 删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier 把事务回滚到标记点;
SET TRANSACTION 用来设置事务的隔离级别。InnoDB 存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ 和 SERIALIZABLE。
MariaDB [ bokebi] > select @@autocommit ; + | @@autocommit | + | 1 | + 1 row in set ( 0.00 sec) 在 MySQL 命令行的默认设置下,事务都是自动提交的,即执行 SQL 语句后就会马上执行 COMMIT 操作。 因此要显式地开启一个事务务须使用命令 BEGIN 或 START TRANSACTION ,或者执行命令 SET AUTOCOMMIT= 0 ,用来禁止使用当前会话的自动提交。
4.MYSQL 事务处理主要有两种方法 1.用 BEGIN, ROLLBACK, COMMIT来实现
- BEGIN 开始一个事务- ROllBACK 事务回滚- COMMIT 事务确认
2.直接用 SET 来改变 MySQL 的自动提交模式:
- SET AUTOCOMMIT=0/false 禁止自动提交- SET AUTOCOMMIT=1/true 开启自动提交 -
3.查看事务
#查看当前的事务 - SELECT * FROM INFORMATION_SCHEMA.INNODB_TRX;#查看当前锁定的事务 - SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCKS;#查看当前等锁的事务 - SELECT * FROM INFORMATION_SCHEMA.INNODB_LOCK_WAITS;
5.事务隔离 事务隔离级别:READ - UNCOMMITTED :可读取到未提交数据 READ - COMMITTED :可读取到提交数据,但未提交数据不可读,产生不可重复读,即可读取到多个提交数据,导致每次 读取数据不一致REPEATABLE - READ :可重复读,多次读取数据都一致,产生幻读,即读取过程中,即使有其它提交的事务修改数据,仍 只能读取到未修改前的旧数据。此为MySQL默认设置 SERIALIZABLE :可串行化,未提交的读事务阻塞修改事务(加读锁,但不阻塞读事务),或者未提交的修改事务阻 塞读事务(加写锁,其它事务的读,写都不可以执行)。会导致并发性能差 查看事务隔离级别:SELECT @@session.tx_isolation ; 查看InnoDB 存储引擎的状态信息:SHOW ENGINE innodb STATUS ;
MVCC和事务的隔离级别: MVCC(多版本并发控制机制)只在REPEATABLE READ 和READ COMMITTED 两个隔离级别下工作。 其他两个隔离级别都和MVCC不兼容, 因为READUNCOMMITTED总是读取最新的数据行,而不是符合当前事务版本的数据行。 而SERIALIZABLE 则会对所有读取的行都加锁
指定事务隔离级别: 1. 服务器变量tx_isolation指定,默认为REPEATABLE - READ ,可在GLOBAL 和SESSION 级进行设置SET tx_isolation= '' READ - UNCOMMITTED READ - COMMITTED REPEATABLE - READ SERIALIZABLE 2. 服务器选项中指定 vim / etc/ my. cnf[ mysqld] transaction - isolation = SERIALIZABLE 死锁:两个或多个事务在同一资源相互占用,并请求锁定对方占用的资源的状态
6.事务回滚案例 简单的事务回滚
MariaDB [ bokebi] > CREATE TABLE bokebi_test( id int ( 5 ) ) engine = innodb ; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > SELECT * FROM bokebi_test; Empty set ( 0.00 sec) MariaDB [ bokebi] > BEGIN ; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test VALUE ( 5 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test VALUE ( 6 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test VALUE ( 7 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > COMMIT ; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > SELECT * FROM bokebi_test; + | id | + | 5 | | 6 | | 7 | + 3 rows in set ( 0.00 sec) MariaDB [ bokebi] > BEGIN ; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test VALUE ( 1 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test VALUE ( 2 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test VALUE ( 3 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > SELECT * FROM bokebi_test; + | id | + | 5 | | 6 | | 7 | | 1 | | 2 | | 3 | + 6 rows in set ( 0.00 sec) MariaDB [ bokebi] > ROLLBACK ; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > SELECT * FROM bokebi_test; + | id | + | 5 | | 6 | | 7 | + 3 rows in set ( 0.00 sec) MariaDB [ bokebi] >
在事务中添加回滚点,从而进行选择性回滚
MariaDB [ bokebi] > SELECT * FROM bokebi_test; + | id | + | 5 | | 6 | | 7 | + 3 rows in set ( 0.00 sec) MariaDB [ bokebi] > BEGIN ; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > SAVEPOINT rollback_point1; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test values ( 1 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > SAVEPOINT rollback_point2; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test values ( 2 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > SAVEPOINT rollback_point3; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > INSERT INTO bokebi_test values ( 3 ) ; Query OK, 1 row affected ( 0.00 sec) MariaDB [ bokebi] > SELECT * FROM bokebi_test; + | id | + | 5 | | 6 | | 7 | | 1 | | 2 | | 3 | + 6 rows in set ( 0.00 sec) MariaDB [ bokebi] > ROLLBACK TO rollback_point3; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > SELECT * FROM bokebi_test; + | id | + | 5 | | 6 | | 7 | | 1 | | 2 | + 5 rows in set ( 0.00 sec) MariaDB [ bokebi] > ROLLBACK TO rollback_point2; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > SELECT * FROM bokebi_test; + | id | + | 5 | | 6 | | 7 | | 1 | + 4 rows in set ( 0.00 sec) MariaDB [ bokebi] > ROLLBACK TO rollback_point1; Query OK, 0 rows affected ( 0.00 sec) MariaDB [ bokebi] > SELECT * FROM bokebi_test; + | id | + | 5 | | 6 | | 7 | + 3 rows in set ( 0.00 sec) MariaDB [ bokebi] >