
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
事务是程序员在学习数据库编程开发技术的时候需要重点掌握的一个编程技术,下面我们就通过案例分析来了解一下,数据库事务基础知识分享。
事务是⼀个抽象层,允许应⽤程序假装某些并发问题和某些类型的硬件和软件故障不存在。各式各样的错误被简化为⼀种简单情况:事务中⽌(transactionabort),⽽应⽤需要的仅仅是重试。
弱隔离级别
1.读已提交ReadCommit
两个保证:
无脏读
无脏写
实现读已提交
防止脏写
使用行锁实现:当事务想要修改特定的对象(行或文档)时,它必须先获得该对象的锁。然后必须持有该锁直到事务提交或中止;
一次只有一个事务可以持有任何给定对象的锁;
如果另一事务想要写入同一个对象,则必须等到一个事务提交或中止后才能获取该锁并继续。
防止脏读
方法一:使用行锁。但实践效果并不好,损失了只读事务的响应时间,并且可能因为等待锁导致连锁反应从而使整体响应迟缓。
方法二:对于写入的每个对象,数据库都会记住旧的已经提交的值,和由当前持有写入锁的事务设置的新值;
当事务正在进行时,任何其他读取对象的事务都会拿到旧值;
只有当新值提交以后,事务才会切换到读取新值。
不足:
不可重复读nonrepeatable或读取偏差readskew
丢失更新Lostupdate
2.快照隔离和可重复读ReadRepeatable
一个保证:
可重复读
不可重复读问题
描述:事务A在对一个对象写入期间,另一个事务B分别在事务A提交前、后读取到不同值的现象。
解决
快照隔离:每个事务都从数据库的一致快照(consistentsnapshot)中读取,即事务可以看到事务开始时在数据库中提交的所有数据,即使这些数据随后被另一个事务更改,每个事务也只能看到该特定时间点的旧数据。
快照隔离对长时间运行只读查询非常有用,如备份和分析。
实现快照隔离
关键原则:读不阻塞写,写不阻塞读。
多版本并发控制MVCC,multi-versionconcurrencycontrol:数据库保留和维护同一个对象在不同时间点的多个提交版本。
PostSQL中MVCC的实现:
当一个事务开始时会被赋予一个的永远递增的事务ID,每当事务向数据库写入任何内容时,它所写入的数据都会被标记上写入者的事务ID。
可见性规则:同时满足以下2个条件,则可见一个对象:
a。读事务开始时,创建该对象的事务已经提交。
b。对象未被标记删除或已被标记删除,请求删除的事务在读事务开始时尚未提交。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!更多内容请加danei0707学习了解。欢迎关注“达内在线”参与分销,赚更多好礼。