数据库要好好学!还有操作系统啥的。
啥是事务
我面试时这样说的:为了缓存一系列CRUD操作,进行读写分离,如果你想要这系列操作,就update了,如果不要,就回滚了。其实我忘了,我真的忘了。百度了下,发现就是CRUD操作的集合,任何查找或者修改数据库的操作,都是事务的一个单元。
事务其目的呢
提供了数据库从失败恢复到正常状态的办法,也就是事务穿透,这一点安卓中都有许多的应用场景。
在多线程并发访问的时候,提供一个隔离方法,防止各自的操作各自干扰
读写分离的思想
这就是读写分离嘛!在cas乐观锁中,他也是把i++操作(举个auto integer的例子)压缩成了一条机器指令;也和okhttp的缓存日志系统一样,只对dirty状态的日志进行crud;也和copy on write arraylist一样,复制一个新容器,对新容器操作。
回滚的思想
fragment碎片就维护着一个碎片record。
例子
1、从A账号中把余额读出来(500)。
2、对A账号做减法操作(500-100)。
3、把结果写回A账号中(400)。
4、从B账号中把余额读出来(500)。
5、对B账号做加法操作(500+100)。
6、把结果写回B账号中(600)
这个作为一个原子操作,即事务。
一致性就是A减了100,B也要加100,不能加50。
隔离性我认为就是一个并发的情形
持久性就是操作了数据库后,数据发生了永久的改变
不考虑隔离性带来的后果:
1.脏读
一个事务修改值的事务,未提交,这个修改的过程中另一个读取值的事务进行了读取,一旦前面一个发生了回滚,就成了脏读。
2.不可重复读
一个事务第一次读一个值,间隔一段时间后再次读取了这个值,在这个间隔中,另一个事务对这个值进行了修改并提交。
3.幻读
一个事务第一次读若干行,间隔一段时间后再次读取若干行,在这个间隔中,另一个事务在这若干行中插入或者删除或者修改了一行并提交。其本质是数据集的改变。
mysql提供的4个隔离级别
① Serializable (串行化):可避免脏读、不可重复读、幻读的发生。相当于锁住整个表。
② Repeatable read (可重复读):可避免脏读、不可重复读的发生。(mysql默认的)
③ Read committed (读已提交):可避免脏读的发生。
④ Read uncommitted (读未提交):最低级别,任何情况都无法保证。