Mysql事务
一、事务定义事务(Transaction):一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务一个完整的业务需要批量DML(数据操纵语言 insert、update、delete) 语句共同联合完成事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同二、事务的四大特性(ACID)Automicity:原子性,事务是最小的执行单位,不允许
一、事务定义
- 事务(Transaction):一个最小的不可再分的工作单元;通常一个事务对应一个完整的业务
- 一个完整的业务需要批量DML(数据操纵语言 insert、update、delete) 语句共同联合完成
- 事务只和DML语句有关,或者说DML语句才有事务。这个和业务逻辑有关,业务逻辑不同,DML语句的个数不同
二、事务的四大特性(ACID)
- Automicity:原子性,事务是最小的执行单位,不允许分割。
- Consistency:一致性,数据库从一个正确的状态变化到另一个正确的状态;
- Isolation:隔离性,并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的
- Durability:持久性,一个事务被提交之后。它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响。
三、事务开启的标志?事务结束的标志?
开启标志
- 任何一条DML语句(insert、update、delete)执行
结束标志(提交或回滚)
- 提交:成功的结束,将所有的DML语句操作历史记录和底层硬盘数据来一次同步
- 回滚:失败的结束,将所有DML语句操作历史记录全部清空
四、事务和底层数据
mysql实现事务是根据undo日志和redo日志实现的
undo:记录修改前的状态,rollback基于undo实现
redo:记录修改后的状态,commit基于redo实现
无论是否开启事务,都会立刻执行,只是开启事务后将执行结果保存在redo中,commit之后才写入磁盘
五、事务提交与回滚
mysql默认情况下,事务是自动提交的,也就是说只要执行了一条DML语句就开启了事务,并且提交了事务
自动提交机制是可以关闭的
开启事务
回滚事务
mysql中begin和start transaction区别
begin或start transaction 都是显式开启一个事务,是等价的;
commit 或commit work都是等价的;
rollback或rollback work 也是等价的;
六、事务产生的问题和事务的隔离界别
事务同时执行出现的问题
- 脏读:事务A读取了B更新的数据,然后B回滚事务A读取到的就是脏数据
- 不可重复读:事务A多次读取同一数据,事务B在事务A多次读取的过程中,对数据作了更新并提交,导致前后结果不一致。
- 幻读:A管理员将学生按照分数分为ABCDE,B管理员在A操作完全部数据之后发现有一条记录没操作,好像出现幻觉一样。
总结:不可重复读侧重修改,幻读侧重新增和删除。不可重复读要锁符合条件的行数据,幻读要锁表
事务的隔离级别
- 读未提交:一个事务还没提交时,它做的变更就能被别的事务看到。
- 读提交(Orlace默认级别):一个事务提交之后,它做的变更才会被其他事务看到。解决脏读。
- 可重复读(mysql默认级别):事务不会读到其它事务提交的修改(一开始读到什么,最后也读到什么)解决脏读、不可重复读
- 串行化:解决了脏读、不可重复读、幻读,相当于单进程,效率低下。
七、事物的作用范围
事务隔离级别作用范围有2种:
- 全局级别(global):对所有会话有效
- 会话级别(session):只对当前会话有效
八、设置事务隔离级别
SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL <isolation-level>
GLOBAL:代表设置全局事务级别
SESSION:代表设置会话事务级别
isolation-level:可以是
- READ UNCOMMITTED
- READ COMMITTED
- REPEATABLE READ
- SERIALIZABLE
设置会话隔离级别为READ COMMITTED↓
SET TRANSACTION ISOLATION LEVEL READ COMMITTED;
或
SET SESSION TRANSACTION ISOLATION LEVEL READ COMMITTED;
设置全局隔离级别为READ COMMITTED↓
SET GLOBAL TRANSACTION ISOLATION LEVEL READ COMMITTED;
九、查看事务隔离级别
查看会话隔离级别
select @@tx_isolation;
show variables like '%isolation%';
查看全局隔离级别
select @@global.tx_isolation;
十、开小灶
spring开启事务和mysql开启事务不一致时会怎样?
答案:以spring事务为主
redis事务和mysql事务的区别?
1.事务指令
Mysql:begin、commit、rollback
Redis:multi(标记事务开始)、exec(执行commands队列)、discard(结束事务,并消除commands队列)
2.事务底层实现
Mysql基于undo日志和redo日志
- undo日志实现了rollback操作
- redo日志实现了commit操作
Redis基于Commands队列实现
3.事务默认状态
Mysql默认开启
无论是否开启事务,都会马上执行命令,只是开启事务后将状态存入redo日志,commit后才写入磁盘
Redis默认关闭
- 没开启事务:立即执行并返回结果,直接写入内存
- 开启事务:不会立刻执行,排入队列,并返回队列状态,调用exec才会执行commands中的命令
4.事务是否支持回滚
Mysql支持回滚 Redis不支持回滚,
可以使用WATCH
去监听key在事务发生之前是否被修改,若被修改则回滚
WATCH
UNWATCh(取消所有监视)
5.事务是否原子性
mysql事务是原子性的,关系型数据库中的事务都是原子性的
redis命令是原子性的,事务不是原子性的
- 若事务队列中存在命令错误(类似java编译性错误),执行
exec
,所有命令都不会执行 - 若事务中存在语法错误(类似java 1/0的运行时异常),执行
exec
,正确命令会被执行,错误命令抛出异常
演示1:
演示2
更多推荐
所有评论(0)