当前位置:网站首页>数据库事务
数据库事务
2022-06-27 18:05:00 【无敌的神龙战士】
MyISAM:不支持事务的
InnoDb:支持事务,支持行锁
事务的概念
一个事务是由一条或者多条对数据库操作的SQL语句所组成的一个不可分割的单元,只有当事务中的所有操作都正常执行完了,整个事务才会被提交给数据库;如果有部分事务处理失败,那么事务就要回退到最初的状态,因此,事务要么全部执行成功,要么全部失败。
- begin:开启一个事务
- commit:提交一个事务
- rollback:回滚一个事务
所以记住事务的几个基本概念,如下:
- 1、事务是一组SQL语句的执行,要么全部成功,要么全部失败,不能出现部分成功,部分失败的结果。保证事务执行的原子操作。
- 2、事务的所有SQL语句全部执行成功,才能提交(commit)事务,把结果写回磁盘上。
- 3、事务执行过程中,有的SQL出现错误,那么事务必须要回滚(rollback)到最初的状态(事务开始前的状态)。
事务ACID特性
- 事务的原子性(Atomic):
事务是一个不可分割的整体,事务必须具有原子特性,及当数据修改时,要么全执行,要么全不执行,即不允许事务部分的完成。 - 事务的一致性(Consistency):
一个事务执行之前和执行之后,数据库数据必须保持一致性状态。数据库的一致性状态必须由用户来负责,由并发控制机制实现。就拿网上购物来说,你只有让商品出库,又让商品进入顾客的购物车才能构成一个完整的事务。 - 事务的隔离性(Isolation):
当两个或者多个事务并发执行时,为了保证数据的安全性,将一个事物内部的操作与其它事务的操作隔离起来,不被其它正在执行的事务所看到,使得并发执行的各个事务之间不能互相影响。隔离级别:数据的安全性和事务的并发性。隔离越严格,安全性越高,并发性越低。 - 事务的持久性(Durability):
事务完成(即事务commit成功)以后,DBMS保证它对数据库中的数据的修改是永久性的,即使数据库因为故障出错,也应该能够恢复数据!
(DB写数据都是先在cache缓存上写的,因为速度快,然后操作系统通过磁盘I/O往磁盘上写,当事务提交后,cache往磁盘上提交数据是要花时间的,这个花时间的过程中如果停电了,或者宕机了,或者自动重启了,那么此时数据就丢了,commit通知应用事务提交成功了,用户理所应当认为该修改的数据都修改成功了,但是由于不可控因素-硬件问题,导致缓存上的数据向磁盘上写的时候没写完。因为commit不是同步操作,commit只要提交事务成功就返回了,并不会等着缓存上的数据向磁盘全部写完才返回。因为我们用户会写很多很多的数据,commit是不会等着这些数据从缓存全部写到磁盘,毕竟要经过磁盘I/O,业务上不可能让commit去等那么长时间。)
但是MySQL的redo log重做日志机制,进行数据恢复,可以保证数据库的永久性,还有undo log回滚日志)
所以说,MySQL最重要的是日志,不是数据!
事务并发存在的问题
事务处理如果不经隔离,并发执行事务时通常会发生以下的问题:
脏读(Dirty Read):一个事务读取了另一个事务未提交的数据。例如当事务A和事务B并发执行时,当事务A更新后,事务B查询读取到A尚未提交的数据,此时如果事务A回滚了,则事务B读到的数据就是无效的脏数据。
(事务B读取了事务A尚未提交的数据)
(脏读必须杜绝,其他下面的情况是事务已经提交了,不能算有问题,解不解决是看业务的需求!!!通过设置不同的隔离级别!!!)不可重复读(NonRepeatable Read):一个事务的操作导致另一个事务前后两次读取到不同的数据。
例如 当事务A和事务B并发执行时,当事务B查询读取数据后,事务A更新操作更改事务B查询到的数据,此时事务B再次去读该数据,发现前后两次读的数据不一样。(事务B读取了事务A已提交的数据)虚读(Phantom Read)幻读:一个事务的操作导致另一个事务前后两次查询的结果数据量不同。例如 当事务A和事务B并发执行时,当事务B查询读取数据后,事务A新增或者删除了一条满足事务B查询条件的记录,此时事务B再去查询,发现查询到前一次不存在的记录,或者前一次查询的一些记录不见了。(事务B读取了事务A新增加的数据或者读不到事务A删除的数据)
事务的隔离级别
(对事务并发执行的控制)
MySQL支持的四种隔离级别是:
1、TRANSACTION_READ_UNCOMMITTED。未提交读。说明在提交前一个事务可以看到另一个事务的变化。这样读脏数据,不可重复读和虚读都是被允许的。
2、TRANSACTION_READ_COMMITTED。已提交读(oracle默认的)。
说明读取未提交的数据是不允许的。防止脏读。但是这个级别仍然允许不可重复读和虚读产生。3、TRANSACTION_REPEATABLE_READ。可重复读。说明事务保证能够再次读取相同的数据而不会失败,即使其他的事务把这个数据改了,你也不会看到前后两次查询的数据的不同。但是虚读仍然会出现。
4、TRANSACTION_SERIALIZABLE。串行化。是最高的事务级别,它防止读脏数据,不可重复读和虚读。串行执行,相当于是单线程操作。所以并发能力最低。

边栏推荐
猜你喜欢
随机推荐
Pointers and structs
Is the account opening QR code given by CICC securities manager safe? Who can I open an account with?
What is ssr/ssg/isr? How do I host them on AWS?
运算符的基础知识
1028 List Sorting
Data intelligence enters the "deep water area", and data governance is the key
Code and principle of RANSAC
Seven phases of CMS implementation
Leetcode 821. 字符的最短距离(简单) - 续集
【bug】上传图片出现错误(413 Request Entity Too Large)
【bug】联想小新出现问题,你的PIN不可用。
OpenSSL client programming: SSL session failure caused by an obscure function
数组练习 后续补充
C# 二维码生成、识别,去除白边、任意颜色
华大单片机KEIL添加ST-LINK解决方法
实战回忆录:从Webshell开始突破边界
Redis cluster Series II
429-二叉树(108. 将有序数组转换为二叉搜索树、538. 把二叉搜索树转换为累加树、 106.从中序与后序遍历序列构造二叉树、235. 二叉搜索树的最近公共祖先)
Implementation of reliable distributed locks redlock and redisson
数智化进入“深水区”,数据治理是关键









