[{"createTime":1735734952000,"id":1,"img":"hwy_ms_500_252.jpeg","link":"https://activity.huaweicloud.com/cps.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=V1g3MDY4NTY=&utm_medium=cps&utm_campaign=201905","name":"华为云秒杀","status":9,"txt":"华为云38元秒杀","type":1,"updateTime":1735747411000,"userId":3},{"createTime":1736173885000,"id":2,"img":"txy_480_300.png","link":"https://cloud.tencent.com/act/cps/redirect?redirect=1077&cps_key=edb15096bfff75effaaa8c8bb66138bd&from=console","name":"腾讯云秒杀","status":9,"txt":"腾讯云限量秒杀","type":1,"updateTime":1736173885000,"userId":3},{"createTime":1736177492000,"id":3,"img":"aly_251_140.png","link":"https://www.aliyun.com/minisite/goods?userCode=pwp8kmv3","memo":"","name":"阿里云","status":9,"txt":"阿里云2折起","type":1,"updateTime":1736177492000,"userId":3},{"createTime":1735660800000,"id":4,"img":"vultr_560_300.png","link":"https://www.vultr.com/?ref=9603742-8H","name":"Vultr","status":9,"txt":"Vultr送$100","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":5,"img":"jdy_663_320.jpg","link":"https://3.cn/2ay1-e5t","name":"京东云","status":9,"txt":"京东云特惠专区","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":6,"img":"new_ads.png","link":"https://www.iodraw.com/ads","name":"发布广告","status":9,"txt":"发布广告","type":1,"updateTime":1735660800000,"userId":3},{"createTime":1735660800000,"id":7,"img":"yun_910_50.png","link":"https://activity.huaweicloud.com/discount_area_v5/index.html?fromacct=261f35b6-af54-4511-a2ca-910fa15905d1&utm_source=aXhpYW95YW5nOA===&utm_medium=cps&utm_campaign=201905","name":"底部","status":9,"txt":"高性能云服务器2折起","type":2,"updateTime":1735660800000,"userId":3}]
当不控制创建,更新,读取,删除时,会出现什么问题?
需要在购买后及时更新数据,避免发生错误。
什么是事务?
事务是一组数据库操作语句(DML),一组要么全部成功,要么全部失败。
事务是多个操作构成的实现一个事情的整体。
一个MySQL数据库,肯定不是一个事务在运行,所以当出现冲突时,那些执行一半的sql语句组成的事务,应该怎么办呢?
备注:
sql语句:
* DDL(定义数据库对象,表与列),
* DML(用于操作数据库表中的记录数据),
* DQL(查询数据),
* DCL(定义访问权限和安全级别)
所以,事务不能单单是sql语句的组合,还需要有以下属性。
* 原子性
:一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。事务在执行过程中发生错误,会被回滚(Rollback)到事务开始前的状态,就像这个事务从来没有执行过一样。
* 一致性
:在事务开始之前和事务结束以后,数据库的完整性没有被破坏。这表示写入的资料必须完全符合所有的预设规则,这包含资料的精确度、串联性以及后续数据库可以自发性地完成预定的工作。
* 隔离性
:数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(
Read uncommitted )、读提交( read committed )、可重复读( repeatable read )和串行化(
Serializable )
* 持久性:事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失。
为什么会出现事务
事务是为了当应用程序访问数据库时,可以简化我们的编程模型。
事务的版本支持
MySQL中只有使用了innodb数据库引擎的数据库或表才支持事务,myisam不支持。
事务提交方式
事务提交方式常见的有两种:
* 自动提交
* 手动提交
查看事务提交方式
用 SET 来改变 MySQL 的自动提交模式,记得改回来
事务常见操作方式
创建测试表
证明事务的开始和回滚
事务隔离级别
数据库中,为了保证事务执行过程中不受干扰,就有了隔离性。
数据库中,允许事务受不同程度的干扰,就有了隔离级别。
隔离级别
* 读未提交【Read Uncommitted】: 在该隔离级别,所有的事务都可以看到其他事务没有提交的执行结果。
* 读提交【Read Committed】 :该隔离级别是大多数数据库的默认的隔离级别(不是 MySQL
默认的)。它满足了隔离的简单定义:一个事务只能看到其他的已经提交的事务所做的改变。
* 可重复读【Repeatable Read】: 这是 MySQL
默认的隔离级别,它确保同一个事务,在执行中,多次读取操作数据时,会看到同样的数据行。但是会有幻读问题。
* 串行化【Serializable】: 这是事务的最高隔离级别,它通过强制事务排序,使之不可能相互冲突,从而解决了幻读的问题。
隔离基本是通过锁来实现的。
查看全局隔离级别
查看当前会话全局隔离级别
设置当前会话or全局隔离级别语法
SET [SESSION | GLOBAL] TRANSACTION ISOLATION LEVEL {READ UNCOMMITTED | READ
COMMITTED |REPEATABLE READ | SERIALIZABLE}
把当前会话隔离级别设置为串行化
我们再来看会话隔离级别就发生了变化
读未提交
开启事务
再开一终端B,通过B访问
一个事务在执行中,读到另一个执行中事务的更新(或其他操作)但是未commit的数据,这种现象叫做脏读(dirty read)。
读提交
可重复读
串行化
隔离级别对比