开启掘金成长之旅!这是我参与「掘金日新计划 · 2 月更文挑战」的第 8 天,点击查看活动详情
1.事务
事务指逻辑上的一组操作,组成这组操作的各个单元,要么全部成功,要么全部失败。在不同的环境中,都可以有事务。对应在数据库中,就是数据库事务。
1.1 事物的回滚(rollback)
当一个事务在执行时,执行中间出错了,就让它恢复成原来的样子
涉及到的操作就是回滚,具体实现是把执行过的操作逆向恢复回去
数据库会把执行的每个操作都记录下来,如果某个操作出错了,就会把事务中之前的操作进行回滚,根据之前的操作,进行逆操作(前面插入回滚就是删除之前插入的)
有了这个操作,那么删表删库是不是就不危险了呢?反正可以回滚么,事实当然不是这样的,回滚的操作是有很大开销的,可以保执行的操作,但也不能无限保存,最多就是保存正在执行的事务,当数据量特别大时,更不可能保存每个数据如何得到,因此删表删库仍然是很危险的操作!!
1.2事务的四大特性(ACID)
事务的四大特性主要是:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)
1.2.1 原子性
原子性是指事务是一个不可分割的工作单位,事务中的操作要么全部成功,要么全部失败。比如在同一个事务中的SQL语句,要么全部执行成功,要么全部执行失败
1.2.2 一致性
事务必须使数据库从一个一致性状态变换到另外一个一致性状态,事物的执行前后数据是合法的
比如银行转账时,A给B转了100,A转出100,B却没有收到100,这时就出现了数据不合法,没有达到一致性
1.2.3 持久性
持久性是指一个事务一旦被提交,它对数据库中数据的改变就是永久性的,接下来即使数据库发生故障也不应该对其有任何影响,保证事务对数据库的改变是生效的
1.2.4 隔离性
一个数据库服务器同时执行多个事务的时候,事物之间的相互影响的程度
隔离性越高,事务之间并发程度越低,执行效率慢,但是数据准确性高,像银行转账.....
隔离性越低,事务之间并发程度越高,执行效率快,但是数据准确性低,像点赞数.....
2.并发引起的问题
2.1 "读脏数据"
当一个事务修改某个数据后,另一事务对该数据进行了读取,由于某种原因前一事务撤销了对数据的修改(即将修改过的数据恢复原值),那么后一事务读到的数据与数据库中的数据不一致,这称之为读脏数据
为了解决这个问题,要降低并发性,提高隔离性,具体操作就是给''写操作''加锁,写的时候不能被读取,降低了一定的效率,但是提高了数据的准确性
2.2 "不可重复读"
当一个事务读取某个数据后,另一事务执行了对该数据的更新,当前事务再次读取该数据(希望与第一次读取的是相同的值)时,得到的数据与前一次的不一样,这是由于第一次读取数据后,事务B对其做了修改,导致再次读取数据时与第一次读取的数据不相同
这次给''读操作''加锁,读的时候数据不能被修改,并发程度进一步降低,隔离性进一步增加,运行速度变慢,数据准确性进一步提高了
2.3 "幻读"
事务A 按照一定条件进行数据读取, 期间事务B 插入了相同搜索条件的新数据,事务A再次按照原先条件进行读取时,发现了事务B 新插入的数据 称为幻读
为了解决这个问题,需要彻底舍弃并发,进行串行化操作,在读的时候不进行其他的操作
3.MySQL的隔离级别
MySQl为了控制并发程度的高低,引入了四个隔离级别,通过修改配置文件就可以改变隔离级别
3.1 read uncommitted
不做任何处理,事务间随意并发,当然上面的三个问题都存在,隔离性最低,并发程度最高
3.2 read committed
对写操作加锁,解决了读脏数据问题,还存在另外两个问题
3.3 repeatable read
对读写操作加锁,解决了读脏数据问题,不可重复读问题
还存在幻读问题
3.4 serializable
严格串行化,解决了三个由并发引起的问题,并发程度最低,隔离性是最高的
看这张图比较直观
编辑