mysql默认事务

5.6版本之前,mysql的默认引擎是Myisam不支持事务。
5.6版本之后,默认引擎是InnoDB支持事务,有四种隔离级别,未提交读、已提交读、可重复读、串行化,默认可重复读。

Myisam和Innodb的区别
1.Myisam只支持表级锁,Innodb支持行级锁
2.Myisam不支持事务,Innodb支持事务
3.Myisam不支持外键,Innodb支持外键
4.Myisam支持全文索引,Innodb不支持,5.6后的版本支持
5.Myisam本身存储了表的总行数,而Innodb没有,所以查询总行数Myisam快,有查询的条件的二者没什么区别

如果执行大量的select,insert MyISAM比较适合,如果有大量的update和insert,建议使用InnoDB,特别是针对多个并发和QPS较高的情况。

查询数据库使用的事务的sql:
select @@global.tx_isolation;

隔离级别脏读(Dirty Read)不可重复读(NonRepeatable Read)幻读(Phantom Read)
未提交读(Read uncommitted)可能可能可能
已提交读(Read committed)不可能可能可能
可重复读(Repeatable read)不可不可可能
可串行化(Serializable )不可能不可能不可能

未提交读(Read Uncommitted):允许脏读,也就是可能读取到其他会话中未提交事务修改的数据
提交读(Read Committed):只能读取到已经提交的数据。Oracle等多数数据库默认都是该级别 (不重复读)
可重复读(Repeated Read):可重复读。在同一个事务内的查询都是事务开始时刻一致的,InnoDB默认级别。在SQL标准中,该隔离级别消除了不可重复读,但是还存在幻象读
串行读(Serializable):完全串行化的读,每次读都需要获得表级共享锁,读写相互都会阻塞

可重复读和幻读
在可重复读中,该sql第一次读取到数据后,就将这些数据加锁(悲观锁),其它事务无法修改这些数据,就可以实现可重复读了。但这种方法却无法锁住insert的数据,所以当事务A先前读取了数据,或者修改了全部数据,事务B还是可以insert数据提交,这时事务A就会发现莫名其妙多了一条之前没有的数据,这就是幻读,不能通过行锁来避免。需要Serializable隔离级别 ,读用读锁,写用写锁,读锁和写锁互斥,这么做可以有效的避免幻读、不可重复读、脏读等问题,但会极大的降低数据库的并发能力。

MySQL、ORACLE、PostgreSQL等数据库,出于性能考虑,都是使用了以乐观锁为理论基础的MVCC(多版本并发控制)来实现。
什么叫MVCC?下一篇介绍。

 

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值