一.什么是事物
事物是一组操作的集合,不可分割的工作单位,事物会把所有的操作当作一个整体一起向系统提交或撤销操作请求,就是这些操作要么一起成功要么一起失败。
二.事物操作 (这个就是一个理解)
1.事务特性
原子性Atomicity:指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生。
一致性Consistency:事务必须使数据库从一个一致性状态变换到另外一个一致性状态。例如:转账前和转账后的总金额不变。
隔离性Isolation:事务的隔离性是多个用户并发访问数据库时,数据库为每一个用户开启的事务执行时,不能被其他事务的执行所干扰,多个并发执行的事务之间要相互隔离。(通过事务的隔离级别保证隔离性)
持久性Durability:指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响
2.事物的隔离级别会产生的问题
脏读:读取其他事物未提交的数据
不可重复度:读取其他事物已经提交修改
幻读:读取其他事务插入的操作
下面有具体设置隔离级别的案例
扩展:这个说的是原子性和隔离性没有关系
通过以下命令查看MySQL事物的提交方式
select @@autocommit
1是自动提交 0是手动提交
mysql中的事物默认自动提交。
可以将mysql中的事物设置为手动提交。
2.1查看/设置事物的提交方式
创建表并插入数据
CREATE TABLE `test_01` (
`id` int DEFAULT NULL COMMENT '主见id',
`name` varchar(10) DEFAULT NULL COMMENT '姓名',
`money` int DEFAULT NULL COMMENT '金额'
) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4 COLLATE=utf8mb4_0900_ai_ci COMMENT='测试表';
INSERT INTO test_01 (id,name,money)
VALUES (1,'张三',2000), (2,'李四',2000);
2.2提交事务
2.3回滚事物
三.脏读,幻读,不可重复读
脏读过程的理解(切换事物的隔离级别,不同的隔离级别会导致数据的脏读,幻读,不可重复读)
第一个窗口中查询的数据
第二个窗口中查询的数据
第一个窗口中开启事物
第二个窗口中开启事物
第一个窗口中开启事物后的查询
第二个窗口中开启事物后的修改并查询
第一个窗口在开启事物后,查询第二个窗口在开启事物并修改数据后的查询
第二个窗口提交事物并查询
第一个窗口在第二个窗口提交事物后,第一个窗口没有提交事物的查询
第一个窗口在提交事物后的查询
总结:在没有关闭inndb自动提交事物和关闭inndb自动提交事物的情况下,都没有发生脏读的情况,都是在各自的窗口中执行各自的操作,另一个窗口的操作并不会对其他窗口有影响。就算是操作(修改,删除,插入)后提交了事物,也不会对其他事物还在进行中的数据有影响。大招(因为我们默认用的隔离级别是 可重复读 (Repeatable read 可重复读) 不会发生 脏读,幻读,不可重复读)
这条查询会返回全局和会话级别的事务隔离级别。全局级别代表服务器级别的默认隔离级别,而会话级别代表当前连接会话的隔离级别。
执行这条查询将返回类似以下的输出:
SELECT @@GLOBAL.transaction_isolation, @@SESSION.transaction_isolation;
mysql8设置隔离级别
在MySQL 8中,您可以使用SET TRANSACTION
语句来设置事务的隔离级别。以下是几个常见的隔离级别设置示例:
1.设置为读未提交(Read Uncommitted):
SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
2.设置为读已提交(Read Committed):
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
3.设置为可重复读(Repeatable Read):
SET TRANSACTION ISOLATION LEVEL REPEATABLE READ;
4.设置为串行化(Serializable):
SET TRANSACTION ISOLATION LEVEL SERIALIZABLE;
请注意,设置隔离级别必须在启动事务(使用START TRANSACTION
)之前进行。一旦事务开始,隔离级别就无法更改。
此外,也可以在MySQL配置文件(通常是my.cnf
或my.ini
)中设置默认的全局隔离级别,或者为单个会话设置隔离级别。这样做可以影响所有新的连接和事务,不必在每次开始事务时都进行设置。
四.隔离级别的具体实现
参考视频:MySQL事务和锁机制详解_哔哩哔哩_bilibili
事物具体的实现方式
原子性,一致性,持久性 通过redo log 和 undo log 实现
隔离性 通过锁和mvcc(多版本控制)实现
就到这,重新写一篇具体的实现