MySQL事务

在MySQL中,我们常用的事务具备ACID(事务管理)四点

一、原子性(Atomicity)

原子性就是指整个事务中的操作,要么全部成功commit,要么全部失败rollback。不能只执行当中的一段,这也就是事务的原子性。

举个栗子

小明需要将花呗里的100额度提取到零钱中进行消费。这就是一个事务,①先判断花呗额度是否有100②花呗额度-100③零钱+100。

这样就可以知道,只要当中任意一步骤报错,都应该进行回滚,反之,如果正常运行,则应该最后提交事务。

二、持久性(Consistency)

数据库需要从一个一致的状态到另一个一致的状态。上述栗子中,我们没有操作成功,需要将花呗额度返回为最初的100,因为事务没有提交,数据没有发生改变,也就是一致性。

三、隔离性(Isolation)

因为一个事务对于其他事务而言应该是不可见的。也是上述栗子而言,我们在进行将额度提取到银行卡时,此时有另一个线程正在访问用户余额。这样就需要是不可见的,这里也就需要我们提到MySQL中的事务的隔离级别。

以下为并发场景,常出现的事务问题

①场景一:用户A正在执行查询数据的事务,用户B正在执行修改数据的事务,用户A再次进行查询时,发现用户A并没有操作数据,数据已经被修改了,并骂骂咧咧的走了。这就是脏读的问题。

②场景二:用户A正在执行查询数据的事务,用户B正在执行修改数据的事务,并且修改完成就commit了事务,这时用户A又查询数据,发现数据又被修改了,又骂骂咧咧的走了。这就是出现了不可重复读的问题。

③场景三:用户A正在新增一条数据,用户B也正在新增同一条数据,并提交了事务,这时候事务A提交事务,发现不行,发现里面已经有了这一条数据了,还是骂骂咧咧的走了。这就出现了幻读的问题。

以上三个并发场景就是我们在设置对应不同的隔离级别时,可能会出现的问题,所以设置隔离级别是很重要的。

MySQL事务_第1张图片

这里的串行化就是将MySQL的谁先提交的事务,需要该事务提交或者回滚后才会执行下一个事务。 

设置这样的隔离级别就可以解决不同的问题,在MySQL中默认的是设置为Read Commited这样的隔离级别。我们需要考虑实际情况,因为对于不同的隔离级别,性能的消耗也是很重要的,虽然串行化的隔离级别是最高的,但是同时性能的消耗也是最大的。

四、持久性(Duration) 

一旦事务提交,你的数据库就会永久存储,因为MySQL是内存存储是在磁盘上的,所以即使系统奔溃的,数据库的数据是持久化的存在的。

你可能感兴趣的:(mysql,数据库,java)