前言
事务的执行原理,当对数据进行操作时,会将数据拷贝到undo日志中,操作记录会被写到redo日志中,如果执行一半出现异常或者rollback会将undo日志中的文件恢复到数据库文件中
1. 事务的ACID属性
原子性,一致性,隔离行,持久性
1.1 原子性
事务中的所有操作要么全部完成,要么全部失败。事务执行后,不允许停留在中间的某个状态
1.2 一致性
不管在任意规定的时间,并发事务有多少,都需要保持运行结果的一直性
1.3 隔离性
隔离事务不受其他并发事务的影响,如同在给定的时间内,改事务是数据库唯一运行的事务一样
隔离的四个级别
隔离级别 | 引起问题 | 功能 |
---|---|---|
read uncommited | 脏读 | 读取未提交的数据(其他事务可以读取当前事务未提交的数据) |
read commited | 幻读 | 读取已提交的数据(其他事务可以读取当前事务已提交的数据) |
repeatable read | 不可重复读 | 重复读取 (事务开启后,已提取的数据如果不做更新操作,是不会更改的(即使别的事务对已提取的数据做修改),重读读取是读取undo日志里面的数据,如果里面没有数据,则表中读取,读取后会保存一份数据到undo日志中) |
serializable | 序列化,事务会按照顺序依次执行 |
read commited 和 repeatable read 区别在于,read commited每次都是从表中获取最新的数据,repeatable read 是读取undo日志中的数据,保证一次事务中数据的一致性
多事务同时操作记录(update,delete操作)
多个事务不能操作相同的数据记录,如果有操作相同的数据记录则需要等待已操作记录的事务提交或者回滚后,依次执行
(编辑一条记录时,只能有一个事务进行操作,其他要进行编辑的事务需要处于排队等待状态)
设置事务个隔离级别
set SESSION TRANSACTION ISOLATION LEVEL 事务的隔离级别 ;
4. 持久性
事务一旦提交,结果便是永久性的
ps:
脏读:当前事务可以读取其他事务中未提交的数据
幻读: 当前事务第一次读取数据后,其他事务修改了读取的数据并提交,当前事务进行第二次读取时,会是最新数据和第一次读取的结果不一致
不可重复读: 当前事务第一次读取数据后,会将数据保存到undo日志文件中,无论其他事务是否修改已读取的数据,当前事务都会从undo中读取数据。即当前事务中每次获取的数据都是相同的,无论外界是否修改