事务指的就是一组原子性的sql查询
ACID
A:整个事务的全部操作要么全部完成要么全部不完成,不能只执行其中的一部分。
C:数据库总是从一个一致性的状态转换到另一个一致性状态consistency
转账之前和转账之后总余额没有变化
I:一个事务对数据库中所作的修改在提交之前对其他事务是不可见的,有四种隔离级别,innodb默认是可重复读Repetable read
show variables like ‘%iso%’ 查看事务的隔离级别或者是select @@tx_isolation
查看global的隔离级别为select @@global.tx_isolation
set session tx_isolation=‘read-committed’;
未提交读:read uncommited,一个事务对数据进行了修改,即使事务还没有提交,对于其他事务也都是可见的,其他事务可以读取未提交的数据,就是脏读未提交的数据就是脏数据
已提交读:read commited,一个事务开始的时候只能看到已经的提交的事务做出的修改**(避免了脏读,但是不能避免幻读和 可重复读(两次执行同样的操作,可能会产生不同的结果)),也就是说一个事务从开始到提交之前做出的修改对其他事物是不可见的(不能避免更新操作带来的问题)**
可重复读:Repetable read,同一个事务多次读取同样的记录是相同的,可重复读不能避免幻读(不能避免删除和插入带来的问题)
可串行化:serializable,在读取的每一行数据上都加锁,可能会导致锁并发锁争用问题性能损耗大,除非在需要数据一致性的是时候并且接收没有并发的情况下,才考虑使用这种方式
幻读:幻读指的是一个事务在前后两次查询同一个范围的时候,后一次查询看到了前一次没有看到
幻读指的是
innodb:默认是可重复读,未提交读,已提交读,可重复读,可串行化这隔离级别逐渐增高**
D:一旦事务被提交,其所作的修改将会永久的保存在数据库中
什么是大事务?
大事务:运行时间比较长,操作的数据比较多的事务
比如:比如余额宝每天都要对所有的用户进行统计,展示等等
大事务的风险:
1.锁定的数据比较多,虽然innodb是行级锁,但是数据库基本上会将存在关联关系的数据一起锁定,造成大量的阻塞和锁超时
2.回滚的时间比较长
3.主库上执行完成之后将事务写道binlog中,要很长时间的话,会造成主从延时
如果处理大事务:
1.避免一次处理很多数据,分批
2.移除在事务中不必要的select操作。