关于事务的几种特性

事务:是一种逻辑操作,把多个操作打包成一个整体能保证,这个整体要么执行成功,要么一个不执行.

(这里并非没有执行)

事务中若干个sql必然是一条一条执行的

事务能够保证,执行到某一条的时候出问题(程序崩溃,系统崩溃)

数据库就能够自动的把前面sql造成的影响给恢复回去

有效避免,部分执行,部分未执行,产生的一些"中间状态引起的问题"

事务的特性

原子性:

原子(即不可再分的操作)

把多个操作打包成一个整体

数据库的事务的原子性,核心就是通过"回滚"(rollback)机制来保证的

为了实现回滚机制,数据库会在执行事务的时候,记录日志(println)

数据库中的日志是写入硬盘的文件中的

当事务最终都执行完毕,中间没有差错,这些记录的内容就可以不要了

但是如果执行事务的过程中,出现了问题,mysql就可以根据日志中记录的内容来进行恢复操作

1.之前新增操作,就把数据删除掉

2.之前进行了删除操作,就把数据新增回去

3.之前进行了修改操作,就把数据改回去

4.之前是查询操作,不影响,不需要任何恢复行为

这里记录的内容就给回滚操作提供了依据.

只要数据库处于正常工作的状态,就能够始终保证事务前进行的操作被正确回滚(关系型数据库一般都支持这一点)

一致性:

执行表事务之前,和执行事务完毕之后,数据是一致的(不会出现这种"对不上"的情况)

也是和回滚有关的,一旦出发回滚了,回滚回去的数据得是对的,如果顺利执行没有出发回滚,数据也是符合要求的.

持久性:

把数据存储在硬盘上.(硬盘的数据可以存储很久很久)

此处的持久,程序重启/主机重启,数据仍然存在.

执行事务对数据库产生的修改,就会在硬盘上持久保存,重启之后仍然存在.

隔离性:

描述的是,数据库并发执行事务时,产生的情况

(提供正确的服务,尽可能提高效率)

并发(多个客户端,同时给服务器,发起事务)

这就相当于降低了并发能力,也就会降低数据库服务器的处理效率.提高了"隔离性,也提高了数据的准确性

1.脏读 :

读到临时数据,临时数据可能被修改

如果写代码理解成事务A,同学看代码理解成事务B,事务B在事务A提交之前进行了数据的读取(读脏数据),后续事务A对数据进行了修改.

我们如何解决这样的问题?

现在引入加锁之后,执行A的过程中,B就不能执行了,需要等待

牺牲一部分效率换来了更高的准确性,并发执行事务的过程中,相互之间是如何影响的,彼此的影响越小,隔离性就越高,反之影响越大,隔离性越低.

2.不可重复读问题

存在三个事务ABC

事务A针对数据进行修改,交提,接下来的失误B进行读取数据(事务b这里的多个sql都要进行读操作)在执行B过程中,又有一个事务C,有针对这个 数据进行了修改,

就会是B里面的不同读操作,读出来的结果不一样

解决:读加锁,在数据进行修改的时候不能读取数据,在就会使并发程度进一步降低,效率也随之降低,隔离性进一步提高,数据的准确性也会提高

这个时候 ABC都不能并发了

3.幻读问题

事务A先修改并交提数据,事务B进行读数据,此时事务c,并没有修改B读的数据,但是给对应的表进行了新增数据/删除数据等操作,导致事务B中,读到的数据集不同

(已有的数据内容是一致的,数据的条数增加,减少)

(可视为"不可不可重复读"的特殊情况)

解决:"串行化"使所有的事务都严格的按照"一个接一个"的方式执行

完全没有并发了.此时执行效率最低,隔离性最高,数据也是最准确

我们将隔离性分为四个级别:

四个级别:

1.read nucommitted:允许读取其他事物未交提的数据  =>并发程度降高,隔离性最低

2.read committed:只能读取其他事务交提的数据 =>解决了脏读,可以重复读,存在幻读 并发程度降低,隔离性提高

3.repeatable read :针对读操作和写操作都加锁 =>解决了脏读+不可以重复读,存在幻读 并发程度降低,隔离性提高

4.串行化(serializable:所有事务都是串行执行的=>解决了脏读+不可以重复读+幻读 并发基本没有,隔离性最

总结:我们在实际开发中很难兼顾效率和准确性,要追求效率,必定要舍去一定的准确性.根据业务场景需要,具体追求的是准确,还是追求效率,是我们程序员所需要权衡的事情.

-----------------------------------

end-

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值