1.事务的四大特性
(1)原子性(Atomicity):
原子性是指事务包含的所有操作要么全部成功,要么全部失败回滚,因此事务的操作如果成功就必须要完全应用到数据库,如果操作失败则不能对数据库有任何影响。
(2)一致性(Consistency):
事务开始之前和事务结束之后 数据的一致性。
(3)隔离性(Isolated)
事务的执行是互不干扰的,一个事务不可能看到其他事务。
(4)持久性(Durable)
意味着在事务完成以后,该事务所对数据库所作的更改便持久的保存在数据库中。
2.事务的隔离级别
(1) read_uncommitted 读未提交
事务读取:不加锁
事务写入:加写锁
解决问题:脏写
存在问题:脏读,不可重复读,幻读。
脏读:脏读是指在一个事务处理过程中读取了另一个未提交的事务中的数据。当一个事务正在多次修改某个数据,而在这个事务中这多次的修改都还未提交,这时一个并发的事务来访问该数据,就会造成两个事务得到的数据不一致。
不可重复读:不可重复读是指在对于数据库中的某个数据,一个事务范围内多次查询却返回了不同的数据值,这是由于在查询间隔,被另一个事务修改并提交了。例如事务T1在读取某一数据,而事务T2立马修改了这个数据并且提交事务给数据库,事务T1再次读取该数据就得到了不同的结果,发送了不可重复读。
幻读:幻读是事务非独立执行时发生的一种现象。例如事务T1对一个表中所有的行的某个数据项做了从“1”修改为“2”的操作,这时事务T2又对这个表中插入了一行数据项,而这个数据项的数值还是为“1”并且提交给数据库。而操作事务T1的用户如果再查看刚刚修改的数据,会发现还有一行没有修改,其实这行是从事务T2中添加的,就好像产生幻觉一样,这就是发生了幻读。
(2)read_committed 读提交(不可重复读)
事务读取:加读锁(每次select完成都会释放读锁)
事务写入:加写锁
解决问题:脏写、脏读。
存在问题:不可重复读、幻读。
(3)(3)repeatable_read 可重复读
事务读取:加读锁(每次select完不会释放锁,而是事务结束后才释放)(如果是Mysql的 innodb还会加间隙锁)。
事务写入:加写锁
解决问题:脏写、脏读、不可重复读,幻读(如果是Mysql的innodb则已解决)
存在问题:幻读(如果是Mysql的innodb则不存在)
(4)serializable 串行化
不管读取还是修改所有的事务串行化执行,一个事务的执行必须等其他事务结束。