一、事务的四大特性:
1.原子性(Atomicity):事务操作的集合是一个整体,不可能出现一部分成功,一部分失败。
2.一致性(Consistency):一个事务执行之前和执行之后,数据库都必须处于一致性状态。举例:A有1000元,B有0元,A、B此时共有1000元;接下来A借B 500元,此时A有500元,B有500元,A、B共有1000元,前后总钱数保持一致性。
3.隔离性(Isolation):彼此并行的事务,相互之间不能干扰。
4.持久性(Durability):事务一旦被提交,对数据库的影响时永久性的。
二、并行的事务可能引发的问题:
为什么要有事务的隔离级别?如果并行的事务,不去考虑它的隔离性,会引发很多问题,比如数据的脏读、不可重复读、幻读,而事务的隔离级别就是为了解决这些问题。那么什么是脏读、不可重复读、幻读呢?这里先简单说一下它的定义,具体细节展示与事务的隔离级别一同说明。
1.脏读:一个事务读取到另一个事务未提交的数据。
2.不可重复读:在同一个事务中,重复执行相同的sql,查询到的结果却不相同。
3.幻读:当某个事务读取范围内的数据时,另一个事务在该范围内插入数据,之前的事务再次读取范围内的数据时,会引发幻读。解释一下:例如在一个事务A中,执行查询,得到的结果集是10条,此时另一个事务B恰好执行了插入操作,事务A再次去查询的时候,却发现结果集有11条,貌似出现幻觉。
三、事务的隔离级别:
事务的隔离级别大致分为四个等级,Read uncommitted(读未提交)、Read committed(读已提交)、Repeatable read(可重复读)、Serializable(串行化),接下来对这四个隔离级别进行解释,并且说明他们分别解决了什么样的问题?(脏读、不可重复读、幻读)
1.Read uncommitted
该隔离级别在字面上的意思就是读取未提交,如果将数据库的隔离级别设为此,就可能引发脏读、不可重复读、幻读的问题。接下来就模拟一下数据库将隔离级别设为此等级,所引发的脏读。首先打开2个cmd窗口,登陆mysql数据库,这两个窗口的作用是一个模拟事务A,一个模拟事务B。然后将当前两个会话的隔离级别设置为Read uncommitted,具体操作:
(1)A窗口首先设置隔离级别为Read uncommitted,然后开启事务,并且查询表bank_account
(2)B窗口同样设置隔离级别为Read uncommitted,开启事务,做money的更新操作,但是并没有提交事务
(3)此时A窗口模拟的事务再次查询表,发现钱数少了,读到了B还没有提交的事务,数据出现脏读
总结:Read uncommitted(读未提交),这一隔离级别较低,会引发脏读问题,实际开发过程中要保证数据的正确性和安全性,一般不会使用此隔离级别。
2.Read committed
字面意思,读到已经提交的数据。这一隔离级别的等级较Read uncommitted要高,不会引发脏读的问题,但是它会引发数据的不可重复读问题,具体解释直接用例子来说明。
(1)A窗口设置隔离级别为Read committed,开启事务,查询表
(2)B窗口设置隔离级别为Read committed,开启事务,做money的更新操作,注意仍然没有提交事务
(3)A窗口再次查询表,发现钱数还是1000,并没有读取到B窗口未提交的数据,说明该隔离级别解决了脏读的问题
(4)那么不可重复读的问题是怎么出现的呢?接下来让B窗口提交事务,A再次查询表的时候就会发现,money的钱数减少了,同样的sql,查询的结果却不同,这就出现了不可重复读的问题
总结:Read committed(读已提交),这一隔离级别虽然解决了脏读的问题,但是却避免不了不可重复读的问题。
3.Repeatable read
字面意思,可重复读。这也是mysql数据库默认的事务隔离级别,可以使用如下的sql语句查看当前数据库的默认隔离级别:select @@tx_isolation;要说的是,这一隔离级别能够解决脏读、不可重复读的问题,但是无法解决幻读的问题。具体还是使用例子说明。
(1)A窗口设置隔离级别为Repeatable read,开启事务,查询表
(2)B窗口设置隔离级别为Repeatable read,开始事务,做money的更新操作,并且提交了事务(注意)
(3)A窗口再次查询表,发现两次查询的结果相同,没有出现查询结果不一致发的问题。说明Repeatable read这一隔离级别避免了不可重复读。
(4)只有当A也提交事务,才能够看见数据的变化
(5)以上例子只能够说明Repeatable read(可重复读)这一隔离级别能够解决脏读、幻读的问题,但是却不能够很好的模拟幻读的出现,那么幻读是什么样子呢?接下来在上面的基础之上模拟一下。让B窗口新增一条数据,并提交它的事务
(6)A窗口再次查询,发现原来总共两条数据,突然变成了三条,幻读出现
4.Serializable
这一隔离级别是安全性最高的,能够解决脏读、不可重读读、幻读等问题,但是过于安全,性能方面就略差一点。
四、图解隔离级别以及对应解决的问题
待补充。。。