MySQL 事务
MySQL 事务
什么是事务
事务就是用户定义的一系列数据库操作,这些操作可以视为一个完成的逻辑处理工作单元,要么全部执行,要么全部不执行,是不可分割的工作单元。
事务的四大属性(ACID)
原子性(Atomicity)
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响
一致性(Consistency)
一致性是指事务必须使数据库从一个一致性状态变换到另一个一致性状态,也就是说一个事务执行之前和执行之后都必须处于一致性状态。
隔离性(Isolation)
隔离性是当多个用户并发访问数据库时,数据库为每一个用户开启的事务,不能被其他事务的操作所干扰,多个并发事务之间要相互隔离。
持久性(Durability)
持久性是指一个事务一旦被提交了,那么对数据库中的数据的改变就是永久性的,即便是在数据库系统遇到故障的情况下也不会丢失提交事务的操作。
事务的开启与提交
对于一个MySQL数据库(InnoDB),事务的开启与提交模式有以下两种:
-
参数 autocommit=0:手动提交事务
-
参数 autocommit=1(系统默认值):自动提交事务
查看当前自动提交功能状况:
show variables like 'autocommit';
+---------------+-------+
| Variable_name | Value |
+---------------+-------+
| autocommit | ON |
+---------------+-------+
1 row in set (0.06 sec)
临时生效设置方法:
SET AUTOCOMMIT=1;
SET AUTOCOMMIT=0;
事务举例:
-- 检查事务状态
show variables like 'autocommit';
-- 开始事务
start transaction ;
set autocommit = 0; -- 设置为手动提交
insert into t_student values(NULL,'张三11',28,0,'13541220000','zs@qq.com');
insert into t_student values(NULL,'李四11',28,1,'12720343341','lisi@qq.com');
COMMIT; -- 提交事务
数据库并发性问题
数据库并发性指的是多个事务可以同时访问数据库中的数据。而当多个事务在数据库中并发执行时,数据的一致性可能受到破坏,从而导致数据出现问题。
事务的隔离级别
数据库指定了 4 种事务的隔离级别,目的是为了解决数据库访问的并发性问题导致的数据的一致性被破坏
- Read uncommitted(未授权读取、读未提交)
- Read committed(授权读取、读提交)
- Repeatable read(可重复读取) MySQL 默认隔离级别
- Serializable(序列化)
悲观锁
悲观锁就是某个事务在更新数据过程中将数据锁定,其他任何事务都不能读取或修改,必须修改完成后才能访问数据(类似于 Java 的线程同步锁机制)
select * from table_name where id=1 for update
- 使用方法:for update
- 特点:具有排他性(通常依赖于数据库锁机制),一般适合短事务处理
优点
可以保障数据库的数据是绝对安全的,它是依赖数据库的锁机制,能很好的解决数据库访问的并发性问题
缺点
会导致数据库访问性能低下,所以适合短事务(事务执行时间很短)的情况
使用场景
对数据安全性要求非常高的场景,比如银行系统、金融系统等
乐观锁
乐观锁并不是一种数据库锁机制,而是一种冲突检测机制(版本冲突检测机制和时间戳冲突检测机制),它的特点就是并发性较好,事务修改数据时,其他事务仍可以修改数据
版本冲突检测机制原理
即每个数据表中有一个版本字段 version,某一个事务更新数据后版本号 +1,另一个事务更新后再 +1,当事务发现数据库当前版本号与读取数据时版本号不一致时,说明在读取数据后该数据已被其他事务修改,则不能更新数据。
优点
可以保障并发性比较好(也就是数据库访问性能不错),因为它是一种软件的冲突检测机制,并不依赖于数据库的锁机制
缺点
并没彻底解决数据库访问的并发性问题,所以数据库的数据不是绝对安全的
使用场景
对数据安全性要求不高而对性能要求很高的场景,比如各种信息管理系统等