mysql 的事务管理
一、事务的基础介绍
-
概念:
事务Transactions:一组原子性的SQL语句,或一个独立工作单元
-
事务日志:记录事务信息,实现undo,redo等故障恢复功能
-
事务的ACID特性
-
A:atomicity原子性;整个事务中的所有操作要么全部成功执行,要么全部 失败后回滚
-
C:consistency一致性;数据库总是从一个一致性状态转换为另一个一致性 状态
-
I:Isolation隔离性;一个事务所做出的操作在提交之前,是不能为其它事务 所见;隔离有多种隔离级别,实现并发
-
D:durability持久性;一旦事务提交,其所做的修改会永久保存于数据库中
-
二、事务的管理
-
启动事务:
- BEGIN
- BEGIN WORK
- START TRANSACTION
-
结束事务:
- COMMIT:提交
- ROLLBACK: 回滚
注意:只有事务型存储引擎中的DML语句方能支持此类操作
-
自动提交:set autocommit={1|0} 默认为1,为0时设为非自动提交 建议:显式请求和提交事务,而不要使用“自动提交”功能
-
事务支持保存点:savepoint 类似快照的作用,但是事务一提交就失效了
-
设置事务保存点 SAVEPOINT identifier
-
MariaDB [hellodb]> savepoint b5; Query OK, 0 rows affected (0.00 sec)
-
回滚到事务保存点 ROLLBACK [WORK] TO [SAVEPOINT] identifier
MariaDB [hellodb]> rollback to a6; Query OK, 0 rows affected (0.00 sec)
-
释放事务保存点 RELEASE SAVEPOINT identifier
ariaDB [hellodb]> savepoint a5; Query OK, 0 rows affected (0.00 sec) MariaDB [hellodb]> release savepoint a5; Query OK, 0 rows affected (0.00 sec) MariaDB [hellodb]> rollback to a5; ERROR 1305 (42000): SAVEPOINT a5 does not exist
-
三、事务的隔离级别
-
事务级别的分类(针对2个及以上事务而言)
说明:小明和小红在A 时刻打开事务后,小明在B时刻提交了事务,又重新打开了事务;但是小红在B时刻并没有提交事务,一直处于一个事务中;小红在T1和T2不同的时间段读数据
事务隔离级别:从上至下更加严格
-
READ UNCOMMITTED 可读取到未提交数据,产生脏读,例图:小红在T1 时间段读到了未提交的数据
-
READ COMMITTED 可读取到提交数据,但未提交数据不可读,产 生不可重复读,即可读取到多个提交数据,导致每次读取数据不一致 ;例图:小红发现在t1时刻和t2读到的数据不一样
-
REPEATABLE READ 可重复读,多次读取数据都一致,产生幻读,即 读取过程中,即使有其它提交的事务修改数据,仍只能读取到未修改 前的旧数据。此为MySQL默认设置。小红认为在T1和T2时读取的数据是一样的,但是实际上T2时间段数据已经发生了更改,T2时间段读的数据都是虚假的
-
SERIALIZABILE 可串行化,未提交的读事务阻塞修改事务,或者未 提交的修改事务阻塞读事务。导致并发性能差 例图:小明和小红开启的事务不能在同一时间发生,不是平行的,必须按顺序来
-
四、事务 隔离级别的设置
- 服务器变量tx_isolation指定,
默认为REPEATABLE-READ,可在GLOBAL和 SESSION级进行设置
SET tx_isolation=’’
READ-UNCOMMITTED
READ-COMMITTED
REPEATABLE-READ
SERIALIZABLE
-
服务器选项中指定
vim /etc/my.cnf[mysqld] transaction-isolation=SERIALIZABLE
来源:CSDN
作者:山贼王
链接:https://blog.csdn.net/qq_36801585/article/details/104101665