一、事务
1、概述2、事务特性(ACID)
(1)原子性(不可分割)(2)持久性(3)隔离性(独立性)(4)一致性 3、事务设置
(1)直接用 SET 来改变 MySQL 的自动提交模式(2)查看 autocommit 模式(3)用 BEGIN, ROLLBACK, COMMIT 来实现 4、并发事务处理带来的问题
(1)脏读(2)不可重复读(3)幻读 5、事务隔离级别
(1)读未提交(read uncommitted):(2)读已提交(read committed):(3)可重复读(repeatable read MySQL 默认隔离级别):(4)串行化(serializable):
一、事务 1、概述事务就是一次完整的数据库操作,这个操作过程中可能包含多条sql执行。这多条sql的自执行时是一个整体,要么都执行成功,要么都执行失败。
eg:
转账操作:从A账号,向B账号转钱;A-100;B+100; 网购下单支付:下订单到卖家;支付到平台
Mysql中只有Innodb引擎支持数据库事务的事务用来管理 insert,update,delete 语句 2、事务特性(ACID) (1)原子性(不可分割)
一次事务过程中多个操作要么都成功,要么都失败,事务在执行过程中发生错误,会被回滚
(Rollback)到事务开始前的状态。
事务一旦提交,数据就不可改变,即便系统故障也不会丢失。
(3)隔离性(独立性)允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。
隔离分为4个级别
- 读未提交 : 问题:脏读读已提交 : 解决:脏读 问题 :不可重复读可重复读 : 解决:不可重复读 问题 :幻读串行化 : 解决一切问题 :加锁 ,效率低
在事务开始之前和事务结束以后,数据库的完整性没有被破坏。
eg:
我们多种方式对银行账户的余额进行多次同时操作,最终余额应该是我们所预期的结果,不能出现错误。
原子性、持久性和隔离性,都是为了保证数据库状态的一致性。 3、事务设置 (1)直接用 SET 来改变 MySQL 的自动提交模式
SET SESSION / GLOBAL autocommit=0; 禁止自动提交
SET SESSION / GLOBAL autocommit=1;开启自动提交(2)查看 autocommit 模式
SHOW SESSION / GLOBAL VARIABLES LIKE 'autocommit';(3)用 BEGIN, ROLLBACK, COMMIT 来实现
BEGIN; / START TRANSACTION; 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认4、并发事务处理带来的问题
当A事务和B事务选择同一行(id)进行操作时,互相不知道对方的存在,则会发生丢失更新问题,即最后的更新覆盖了前一个程序员所做的更改。
(1)脏读读到了垃圾数据,读取到其他事务未提交的数据
1.事务 B 更新年龄 18
2.事务 A 读取数据库信息,年龄是 18
3.事务 B 回滚
(2)不可重复读
A事务开启后,读取两次数据,结果两次读到的内容不一样(预期的效果是A在同一个事务中读取到的数据应该是一样)。
(3)幻读
A事务开启后,读取到的两次两次数据数量不一样
1.事务 A 读取年龄大于 15 的数据,发现有 1 条记录
2.事务 B 插入一条记录,并提交
3.事务 A 再读取年龄大于 15 的数据,发现有 2 条记录
5、事务隔离级别
以下事务隔离是指在Innodb下的事务隔离级别。查看隔离级别
SELECT @@global.transaction_isolation,@@transaction_isolation;
设置隔离级别
SET SESSION/GLOBAL TRANSACTION ISOLATION LEVEL READ UNCOMMITTED(1)读未提交(read uncommitted):
A可以读取到B未提交的修改。
问题:脏读,幻读,不可重复读。
A只能读取B已经提交的修改。
问题:避免了脏读,仍然存在不可以重复读和幻读问题。
A事务中多次读取相同的数据返回的结果是一样的。
问题:避免了脏读和不可重复读问题,(mysql8之后幻读不存在)但是幻读依然存在。
事务串行执行,避免了以上所有问题



