1.事务的基本概念
数据库事务指 一系列数据库操作作为一个逻辑单元,要么全部执行,要么全部不执行。
2.事务的四大特性
原子性(automic):对于一系列的数据库操作,要么全部执行,要么全部不执行。
一致性(consistency):事务完成后所影响的数据在逻辑上保持一致。
什么是一致性?数据的一致性可以从多个方面来说,比如银行转账两账户的金额总和。再比如mysql集群上对一个服务器的数据进行了修改其他服务器的数据同是否步一致。强一致性:一条数据的修改,能被后续的访问都看到。 弱一致性:后续部分或全部访问不到修改数据。 最终一致性:经过一段时间后,所有后续访问都能看到修改后的数据。
隔离性(isolation):对于并发事务,一个事务不能使用另一个事务的中间状态的数据。
持久性(duration):事务完成后,对数据的影响是永久性的。
3.并发情况下数据库访问出现的几种问题
3.1.脏读
脏读指你在事务中修改了一条记录,我读取了修改后的值,然后进行逻辑处理,最后你又将事务回滚导致修改作废,而我使用这条作废的记录值,最终导致了脏读。
解决办法: 一个事务完成后修改的数据才能被其他事务可见。
3.2.不可重复读
不可重复读指我先读取了一条记录,然后你修改了这条记录,然后我再读取的时候,发现两次读取的数据不一致。
解决办法: 对自己读取的数据加行锁。
3.3.幻读
幻读指我读取了一个表的所有行数,然后你新增或删除了一行数据,然后我再查询表行数的时候发现两次不一致。
解决办法:对整个表加表锁。
4. 事务的隔离级别
read uncommit, 事务没有提交,数据就被读取,不能解决脏读,不可重复读和幻读。
read commit, 事务提交后,修改的数据才能被其他事务可见,可解决脏读,不可解决不可重复读和幻读。
repeatable read,可重复读,读事务操作的数据加行锁,一次事务中读到的数据不会被其他事务更改,可解决脏读,不可重复读,不能解决幻读。
serializable, 串行化,对整个表加锁,可解决脏读,不可重复读,幻读。