目录
⌛原子性
⌛一致性
⌛持久性
⌛隔离性
⌛脏读问题
⌛幻读
事务的作用:
在很多情况下我们需要保证几个sql语句都执行成功或者都不执行,比如像是双方之间的互相转账,这个操作涉及到了很多步骤,有修改数据双方的数据,查找数据,我们必须保证这几步都是要执行成功的。即使出现网络问题导致转账失败,我们就要保证这几步都没执行,或者换句话说,保证数据回到执行转账前的样子,为了保证这些就引出了事务。
事务本质就是把多个sql语句打包在一起,成为一个整体(原子性:要么都执行,要么都不执行)。如果出行类似断网之类情况,数据库就会利用回滚机制将数据还原到执行事务操作之前的样子。(数据库中有专门记录事务操作步骤的日志)。
事务的四个关键特性:
原子性
原子性(初心):保证几个sql是一体的,最核心的特性。
一致性
简单理解,例如上面的转账,我们需要保证转出方账户数据的变动,要与转入方数据的变动要合理。一致性也就体现在数据的变动方面。
持久性
事务修改的内容是写到硬盘上的,持久存在,不会因为断网之类的事故导致数据丢失。
隔离性
为了解决“并发”执行事务,引起的问题
也就是多个客户端一起尝试对同一个账户进行操作
事务隔离性所解决的问题
脏读问题
首先我们要知道什么是脏数据,并不是说这个数据埋汰了,是指当前读到的数据是无效数据。
例如:事务A正在进行数据的修改,这时数据B对数据进行了读取,这时数据A还有可能对数据进 行修改,如果修改了,那么事务B所读取的数据就是无效数据,也就是脏数据。
解决方法:给写操作加锁。也就是事务A修改数据时,不允许其他事务来 读数据,是由事务A完成 了对数据的修改,其他事务才能进行读操作。
不可重复读
在解决脏读问题的基础上,还有不可重复读问题
例如:事务A完成了对数据的修改,事务B对数据进行了读操作,但是在事务B读数据的过程中, 事务A又再次对数据进行了修改,就回导致事务B在读的数据不一致。也就是不可重复读问 题。
解决方法:给读操作加锁。很显然就是让事务B在进行读操作的时候不会有其他事务来进行对数 据的修改。
幻读
在读操作和写操作前提下,又有了幻读问题
例如:一个事务两次读取一个数据,发现读的数据的值是没有变的,但是读到的数据结果集是不 一 样的。(第一次读有一个java文件,第二次读时这个java文件的数据没有改变,但是读 到的不知有一个java文件,还多了其他文件)
解决方法:数据库使用“串行化”(放弃并发执行,改为并行执行)。