数据库-事务的四大特性和四大隔离机制

本文详细解释了数据库事务的四大特性——原子性、一致性、隔离性和持久性,并通过转账示例阐述了它们的概念。原子性确保事务的不可分割性,一致性保证数据在事务执行前后的状态一致,隔离性防止并发操作带来的数据不一致,而持久性则确保事务提交后的变更永久保存。同时,文中提到了四种不同的隔离级别及其可能导致的问题,如脏读、不可重复读和幻读。

四大特性:原子性、一致性、隔离性、持久性

原子性

事务是最小的执行单位,不允许分割,事务的原子性确保动作要么都完成,要么都不完成

        举例:A给B转账100元,

        要么就转账成功:A这里少了100块,B那里就必然多了100块;

        要么就转账失败:A没有少,B也没有多;

        就是一个:一个事务,要么成功,要么失败;不然不构成原子性

一致性

执行事务前后,数据保持一致,多个事务对同一个数据的读取结果是相同的

所谓一致性是数据库处理前后结果应与其所抽象的客观世界中真实状况保持一致。这种一致性是一种需要管理员去定义的规则。管理员如何指定规则,数据库就严格按照这种规则去处理数据。

(这句话引自:如何理解事务一致性?_c0d5r的博客-优快云博客_事务一致性怎么理解

        举例:A账户总共5000元,不论怎么他怎么给B转,AB账户合计总额还是5000.这就是一致性

隔离性:

并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库时独立的

另外:四种隔离机制:

隔离级别一读未提交:绝大部分数据库不会使用这样的隔离机制;

读取到其他事务还未提交的数据,例如:

A事务执行了SQL语句,没有COMMIT,被B事务读到了,但是A最终没有COMMIT,这样B读到的数据就是脏数据,就是“脏读

隔离级别二读已提交:大部分数据库是这个级别的隔离机制

只能读取其他事务已经COMMIT提交的数据,避免脏读;

但是还是可能会出现不可重复读的问题,例如

事务A要进行两次select语句,在执行第一次select语句后,事务B对这个数据执行了UPDATE;然后事务A在第二次select时,读到的数据和第一次不一样;就造成了“不可重复读

隔离级别三可重复读:MySQL就是这个级别

保证同一个事务的多个实例在并发读取数据时,会“读取到同样的数据”,就像上面那个例子,事务A进行两次select语句,在执行第一次select语句后,事务B对这个数据执行了UPDATE;但是此时

事务A第二次select并不会读取到不同的数据,只会读取到和第一次一样的数据;

但是可重复读并不能解决幻读问题;

幻读:幻读是指当事务不是独立执行时发生的一种现象,例如第一个事务对一个表中的数据进行了修改,比如这种修改涉及到表中的“全部数据行”。同时,第二个事务也修改这个表中的数据,这种修改是向表中插入“一行新数据”。那么,以后就会发生操作第一个事务的用户发现表中还存在没有修改的数据行,就好象发生了幻觉一样.

隔离级别四:serializable可串行化:最高隔离级别,很少用到,除非客户数据很私密

通过强制事务排序,在每个读的数据行上加锁,来解决幻读问题;

强制事务排序:一个事务在执行的时候,其他事务是不可以进行执行的;这种隔离级别效率很低

 持久性:

一个事务被提交之后,它对数据库中数据的改变是持久的,即使数据库发生故障也不应该对其有任何影响

评论
成就一亿技术人!
拼手气红包6.0元
还能输入1000个字符
 
红包 添加红包
表情包 插入表情
 条评论被折叠 查看
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值