数据库 事务级别介绍
2个概念:事务,锁。
事务:逻辑单元内的一系列操作,要么全部完成执行,要么全部不执行。
锁:将某数据的操作加锁,则其他人无法获取当前数据的当前操作。避免单位时间内的数据覆盖,影响数据的一致性。
事务是多个操作的执行逻辑与的集合。事务内控制加锁,实现不同的级别。事务内的锁,需等事务结束才能释放锁。不加事务的锁,操作完即释放锁。
三操作:
读,rade -R
写,write -W
增,add -A
锁分类:锁住操作,避免其他人获取。
写操作枷锁 排它锁 X 锁
读操作加锁 共享锁 S 锁。
(X锁与S锁无法共存,一个数据即只能取一种锁)
事务级别:
Read Uncommitted –1个事务,1个X锁,即对写数据枷锁。读无锁。
对写枷锁,避免了数据的覆盖,丢失。但是事务内可读,存在读取未提交或回滚的数据,出现脏数据。 该级别是数据库最低级别。
Read Committed –1个事务,2个锁。事务内X锁。
读写的枷锁,避免了数据丢失与脏数据。若是在多数据单元处理时,一条记录加事务,未加事务的记录,因可做写操作,不能重复读。否则数据前后读取不一致。
Repeatable read —2个事务,2个锁。
避免了数据的丢失,脏,以及不可重复读情况。但是在事务内操作的情况下,数据库增加记录不可控,即会出现符合是事务内搜索条件的记录,但是不添加进事务。事务执行完,即有满足条件为修改的数据,为幻读。
Serializable 串行化。即不可并行操作数据库。
避免上述问题,但是影响数据库的效率。
延伸:MVCC 多版本控制—multi-Version current control
MySql数据库中实现
读操作不加锁情况下实现可重复读。
对数据库记录增加 事务ID 与回滚指正字段
。
事务ID 递增。
每次读取操作是,增加一个 read view 的数据结构,控制数据的版本信息。
read view 中包含 当前事务列表,Tmin Tmax .
通过事务ID 来实现数据的可见性。只有在上次提交后 本次事务前的数据记录可见。即事务内的一次读取的数据在被修改后,二次读取的还是事务前的记录数据。
详情见 刘欣 码农翻身公众号 数据库旺财与小强。