一、四大特性ACID
1. 原子性(Atomicity):
事务包含的所有操作要么全部成功,要么全部失败回滚。
2. 一致性(Consistency):
一个事务执行之前和执行之后都必须处于一致性状态。
3. 隔离性(Isolation):
多个并发事务之间,应当相互隔离。
4. 持久性(Durability):
指一个事务一旦提交,它对数据库中的数据的改变就应该是永久性的。
二、数据库事务隔离级别
1、未提交读(Read uncommitted):
事务中的修改及时没提交也会被其他事务可见,这样会产生脏读(虚读),如果事务失败回滚,则其他事务之前的到的数据则是脏数据。
2、提交读(Read committed)
在事务完成提交之前,其他事务看不到该事务的修改结果。执行两次同样的查询可能看到不一样的结果。
3、重复读(Repeatable read)
事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。事务A再读取时,却发现数据发生了变化。造成了幻读。
不可重复读和幻读有什么区别的呢?不可重复读针对update,幻读针对insert与delete
4、序列化(Serializable)
Serializable是最高的事务隔离级别,同时代价也花费最高,性能很低,一般很少使用。
为什么Read committed 能读到最新的数据(当前读),Repeatable read读到的是老的数据(快照)。
MVCC中的read view 生成原则,导致在不同隔离级别()下,read committed 总是读最新一份快照数据,而repeatable read 读事务开始时的行数据版本
Repeatable read能不能解决幻读?
可以解决也可以不解决,看需求。
MySQL InnoDB的可重复读并不保证避免幻读,需要应用使用加锁读来保证。而这个加锁度使用到的机制就是next-key locks。
如果使用普通的读,会得到一致性的结果,如果使用了加锁的读,就会读到“最新的”“提交”读的结果。
总结的不好,以后再细化吧。