什么是事务
数据库事务,是指为了完成某个业务对数据库进行一系列操作(通常是增删改操作),这些操作要么都完成,要么都失败。
举例:张三转账给李四的账户500元,这需要两条SQL语句
1).张三的账户要减去500元;
update 账户表 set money=money-500 where name='张三';
2).李四的账户加上500元;
update 账户表 set money=money+500 where name='李四';
此时,如果说在第一条sql语句执行完之后,在执行第二条语句之前,程序因为某种原因出错抛出异常,导致张三的账户少了500元,而李四的账户并没有收到500元,这种情况在生活中是不允许发生的。
如果在转账过程中加入事务,则整个转账过程中执行的所有SQL语句会在一个事务中,而事务中的所有操作,要么全都成功,要么全都失败,不可能存在成功一半的情况。
也就是说给张三的账户减去500元如果成功了,那么给李四的账户加上500元的操作也必须是成功的;否则,给张三减去500元以及给李四加上500元都是失败的。
事务的四大特性
原子性:即事务所涉及的各个操作要么全部成功,要么全部失败。
一致性:事务执行后,数据库状态与其它业务规则保持一致。
隔离性:隔离性是指在并发操作中,不同事务之间应该隔离开来,使每个并发中的事务不会相互干扰。
持久性:事务提交之后,数据最终会保存在数据库当中(硬盘上)。
事务隔离级别
1)读未提交:一个事务可以读取到另外一个事务尚未提交的数据。该隔离级别可能会产生“脏读”、“不可重复读取”和“幻影读取”问题。
2)读已提交: 一个事务只能读取到另外一个事务已经提交的数据。该隔离级别解决了“脏读”问题,但是可能会产生“不可重复读取”和“幻影读取”问题。
3)可重复读取: 在同一个事务当中,多次读取得到的结果一样。该隔离级别解决了“脏读”和“不可重复读取”问题,但是仍然可以能会产生“幻影读取”问题。
4)串行化:事务不能同时执行,需要一个一个排队。不会产生上述问题了。但是性能太差,不推荐使用。
总结:隔离级别从低到高分别是“读未提交–>读已提交–>可重复读取–>串行化”,隔离级别越高,性能越低,可靠性越高。在实际使用当中,要结合具体的要求来设置具体的隔离级别。