MySQL事物
文章目录
MySQL事物
1、事务概念
- 事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果,保证事务执行的原子操作
- 事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上
- 事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态
2、事物处理命令
#查看MySQL是否自动提交事务
SELECT @@AUTOCOMMIT;#0表示手动提交事务,1表示自动提交事务
#设置事务提交方式为手动提交方式
set autocommit=0;
#开启一个事务
BEGIN;
#提交一个事务
COMMIT;
#回滚一个事务到初始的位置
ROLLBACK;
#设置一个名字为point1的保存点
SAVEPOINT point1;
#事务回滚到保存点point1,而不是回滚到初始状态
ROLLBACK TO point1;
#设置事务的隔离级别
SET TX_ISOLATION='REPEATABLE-READ';
#查询事务的隔离级别
SELECT @@ TX_ISOLATION;
3、ACID特性
- 每一个事务必须满足下面的4个特性:
- 事务的原子性(Atomic):
事务是一个不可分割的整体,事务必须具有原子特性,及当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成
- 事务的一致性(Consistency):
一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。
就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务,总体上数据是不变的,保持一致性转态
- 事务的隔离性(Isolation):
当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响
- 事务的持久性(Durability):
事务完成(commit)以后,DBMS保证它对数据库中的数据的修改是永久性的
例如,事物再提交之后,在数据库刷盘过程中,即便因为故障出错,也应该能够恢复数据
- ACID的底层实现:
ACD依靠的是数据库的redo log和undo log实现的;I是依赖数据库的锁实现的
4、事务并发存在的问题
- 事务处理不经隔离,并发执行事务时通常会发生以下的问题:
- 脏读(Dirty Read):
一个事务读取了另一个事务未提交的数据
例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时事务A回滚,则事务B读到的数据就是无效的脏数据(事务B读取了事务A尚未提交的数据)
- 不可重复读(NonRepeatable Read):
一个事务的操作导致另一个事务前后两次读取到不同的数据
例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样
- 虚读(Phantom Read)幻读:
一个事务的操作导致另一个事务前后两次查询的结果数据量不同
例如当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了
脏读和不可重复读是基于数据值的错误,幻读是基于条数增加或者减少的错误
5、事务的隔离级别
- MySQL支持的四种隔离级别是:
1、TRANSACTION_READ_UNCOMMITED
未提交读:说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的
set tx_isolation='READ-UNCOMMITTED';
2、TRANSACTION_READ_COMMITED
set tx_isolation='READ-COMMITTED';
已提交读:说明读取未提交的数据是不允许的。这个级别仍然允许不可重复读和虚读产生
3、TRANSACTION_REPEATABLE_READ
可重复读:说明事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现
set tx_isolation='REPEATABLE-READ';
- 说明:
在目前版本中,可重复读在一定程度上可以避免insert/delete幻读,但是无法避免update幻读
4、TRANSACTION_SERIALIZABLE
串行化:是最高的事务级别,它防止读脏数据,不可重复读和虚读。
set tx_isolation='SERIALIZABLE';
相关文章
- mysql中not exists用法_not exists用法
- Linux云服务器安装mysql数据库
- 管理MySQL安全管理:确保最佳保障(mysql安全)
- MySQL的双表操作:乐趣无穷(dual表mysql)
- MySQL中查询表引擎机制研究(mysql查询表引擎)
- MySQL 集群搭建:构建高可用系统的最佳方案.(mysql集群搭建方案)
- MySQL 过程中如何使用 IF 语句(mysql过程if)
- MySQL:记录第一次初体验(mysql第一条记录)
- 轻松学习易语言、PHP与MySQL组合(易语言phpmysql)
- 解析MySQL的多用户功能,实现更高效的数据库管理!(mysql多用户)
- 安卓手机上MySQL管理神器(安卓mysql管理器)
- MySQL实现金额转换成中文大写(mysql 金额 大写)
- 深入剖析MySQL:实现原理解析(mysql实现原理)
- MySQL环境搭建:7步完成一键部署(mysql环境搭建)
- MySQL 处理一对多关系的计数方法探究(mysql一对多计数)
- 深入理解MySQL查询语句提高查询效率的技巧与方法(mysql――query)
- MySQL收费化,数据库方案提前解决(mysql不免费了)
- 如何解决mysql下载网站加载缓慢的问题(mysql下载网站好慢)