我们系统中的一个业务,可能会包含很多个sql操作,例如销售业务,可能会有下订单,减库存,减余额等很多步对数据库的操作,这些操作每一步都是不可分割的因此就要用事务管理。
(1).在MySQL中只有使用InnoDB数据库引擎的数据库或表才支持事务。
(2).事务处理可以保证数据库的完整性,保证成批的sql语句执行一致,要么全部成功,要么全部失败。
(1).MySQL的事务可以分为显式事务和隐式事务,默认的就是隐式事务,由变量autocommit控制,每次执行一句sql都会自动开启事务和提交事务
show variables like 'autocommit'
(3).只读事务和读写事务
我们可以使用read only开启只读事务,开启之后insert和update语句都是不允许的。语句实例如下
statr transaction read only
select * from....
select * from....
commit;
可以使用savepoint关键字在事务执行中新建保存点,之后可以使用rollback回滚到保存点,示例代码如下:此时回滚就会回滚到保存点。
statr transaction
select * from....
save point a
select * from....
rollback to a;
*MySQL是不支持嵌套事务的,当在一个事务中开启另一个事务就会隐式提交上一个事务。
一个事务的操作要么全部成功,要么全部不成功。不会在执行的过程中的某个环节结束。事务执行过程中如果发生错误,会被rollback到事务执行之前的状态。
事务开始前和结束后,数据库的完整性没有被破坏。数据库的状态应该和业务规则保持一致。例如A向B转账,A减去的钱数必须和B增加的钱数一致。其他三个特性都是在为一致性服务。
数据库允许多个并发事务对数据进行修改和读取,隔离性可以防止在多个事务修改共享数据时发生的数据不一致的现象。事务隔离级别分为不同等级,包括读未提交(Read uncommitted),读提交(Read committed),可重复读(repeatable read)和串行化(Serialization)。
事务结束以后对数据的修改就是永久的,即使系统故障也不会丢失。
隔离强调的是两个或两个以上同时发生(并发)的业务同时操作一个数据库,为了让两个事务一方面能 都看到、得到正确的结果,一方面还要保证一定的效率而产生的不同的隔离级别。隔离级别分为四种:
[ru隔离级别]:简单来说就是一个事务可以读到其他事务未提交的数据。这种隔离级别最低,这种情况下可能会产生脏读,不可重复读,幻读的问题。
脏读:指的是一个事务读到了其他事务未提交的数据,这些数据可能会回滚,导致读到的数据不准确。
[rc读已提交]:指的是读到了别人已提交的数据,在一个事务中当我们第一次读取了一个数据之后,其他的事务修改了这个数据,并且commit了,当我们再次读到这条数据时,就和我们第一次读到的数据不一致,这就违背了事务的原子性,两次读到的数据不一致。主要是update和delete语句会导致不可重复读。
[rr可重复读]:指的是在同一个事务中,发出同一个select语句多次,产生的结果集总是相同的,在RR隔离级别中可能会出现幻读。
幻读:
一个事务按照某些条件进行查询,事务提交前,另一个事务插入了满足其条件的其他数据,再次使用相同的条件进行查询时,发现多了一些数据,就像出现幻觉一样,幻觉主要针对delete和insert语句。
不可重复读强调的是两次读取的数据内容不同,可重复读强调的是读到的数据行数不同。
指的是当两个事务想要同时操作一个数据时,在事务A开始操作时,事务B只能阻塞,排队等待,等到事务A结束操作commit之后,事务B才能开始操作。这样的隔离级别吞吐量很差,十分影响性能。