MySQL事务的特性(ACID)
原子性 A
事务包含的所有操作要么全部成功,要不全部失败回滚因此事务的操作如果成功就必须要完全应用到数据库,如果
操作失败则不能对数据库有任何影响。
一致性 C
事务必须使用数据库,从一个一致性状态变换到另一个一致性状态拿转账来说,假设用户A和用户B两者的钱加起来一共时5000,那么不管是A和B之间如何转账,转几次帐,事务结束后两个用户的钱相加起来应该还得是5000,这就是事务的一致性。
隔离性 I
当多个用户并发访问数据库时,比如操作同一张表时,多个并发事务之间要相互隔离,不能被干扰。对于任意两个并发的事务T1和T2,在事务T1看来,T2要么在T1开始之前就已经结束,要么在T1结束之后才开始,
这样每个事务都感觉不到有其他事务在并发地执行。
持久性 D
一个事务一旦成功提交了,那么对数据库中的数据改变就是永久性的
事务一旦提示成功处理,即便是在数据库系统遇到故障的情况下,也不会丢失提交事务的操作,必须要将事务完全执行完成。
事务的隔离级别
隔离性保证了操作中的事务不相互影响,具有四种隔离级别
Read Uncommited(读取未提交内容)
在该隔离级别,
所有事务都可以看到其他事务未提交的执行结果。会产生
脏读
在事务1中,Mary查询自己的工资为1000
在事务2中,财务人员将Mary的工资改为了8000,但未提交事务
在事务1中,Mary再次查询自己的工资,发现变为了8000
在事务2中,财务人员发现出错了,将事务2回滚,Mary工资又变为了1000
Read Commited(读取已提交内容)
一个事务只能看见,事务已经提交所做的改变,避免了脏读出现会产生
不可重复读:同一个事务中,两次读取的结果不一致
在事务1中,Mary查询自己的工资为1000
在事务2中,财务人员将Mary的工资改为了8000,提交事务
在事务1中,Mary再次查询自己的工资,发现变为了8000
Repeatable Read(可重读)
这是MySQL的
默认事务隔离级别保证一个事务只能读取一个事务提交的数据,
还会在第一次读取到数据后,就将这些数据加锁(悲观锁),其他事务无法修改这些数据,因此实现可重复读。这样的事务隔离级别能够防止脏读,不可反复读,但无法避免幻读幻读:当用户读取某一范围的数据时,另一事务又在该范围内
插入了新数据(不是修改,因为原有的数据已经被加锁了,无法被修改),当用户再读取该范围时,会发现新的”幻影”行
在事务1里,第一次读取全部工资为1000的员工,共读取10条记录
这时事务2,插入了一条员工记录,工资也为1000
在事务1里,第二次读取全部工资为1000的员工发现读取到11条记录,产生了幻读
可串行化(Serializable)
这是花费最高代价,最可靠的事务隔离级别
事务被处理为顺序运行。防止脏读、不可重复读、幻读
它是在每个读、写操作的数据行上加上共享锁。在这个级别,可能导致大量的超时现象和锁竞争。