数据库事务个人笔记

数据库事务

四大特性:

原子性、一致性、隔离性、持久性

事务隔离级别(等级由低到高):

1.Read Uncommited 读未提交

一个事务可以读取另一个事务未提交的数据。
比如有两个事务A、B,B事务update数据,但还没提交,这时候事务A可以读取B事务刚刚update的数据。
脏读、不可重复读、幻读

2.Read Commited 读已提交

若有事务A对事务进行对行L更新时,事务B要等事务A提完后才能够读取行L的数据。
会锁住相应的行。
不可重复读、幻读

3.Repeated Read 重复读(mysql默认级别)

开启事务A对行L进行读取操作,开启事务B对行L进行update并提交,事务A再对行L进行读取,两次读取的内容一致。
不会锁行。
主要为了解决不可重复读。

4.Serializable 串行化

开启事务A查询表T的初始值,再开启事务B插入、更新表T,这时会插入、更新失败,因为设置事务隔离级别设置为Serializable会锁表。
会锁住整张表。
并发性极低,开发中很少会用到。


事务隔离级别越高,越能够保证数据的完整性和一致性,但对并发性能的影响也越大,对于大多数的应用程序而言,可以优先设置数据事务隔离等级为Read Commited,它能够避免脏读,并发性能也较好。尽管会导致不可重复读、幻读,但在可能出来这些问题的情景下,可以由应用程序采用乐观锁和悲观锁来控制。

乐观锁

实现方式
在表中加一个字段时间戳或version字段,在表更新时验证更新数据是否为过期数据。
如更新表T的Count字段 ,读取count数据时连同version一直读出,之后对version加1,些时再将提交数据的version值与数据库对应记录的version信息进行比较,如果大于则进行更新,否则认为是过期数据。
Update T as t set t.count = 更新值 where t.version < 更新后的版本号
更新成功返回记录数大于0,更新失败返回记录数等于0。

悲观锁

Mysql 的实现方式
Select * from T where condiction = condiction for update.
上面这句sql 语句会锁定所有符合检索条件condiction的记录。在事务提交前外界无法修改这些记录。


数据库的锁机制后面再来补充。

你可能感兴趣的:(数据库)