数据库引擎
Innodb:支持事务处理,支持行锁(也支持表锁,得根据where子句条件的索引命中情况)
MyISAM:不支持事务处理,表锁。但是在该引擎下使用事务处理也不会报错。
事务处理有四个特性:
原子性:组成事务处理的语句形成了一个逻辑单元,不能只执行其中的一部分。
一致性:在事务处理执行前后,数据库是一致的。就是要么回滚到执行前的状态,要么提交到执行后的状态。
持久性:事务处理的效果能够被永久保存下来。反过来说,事务应当能够承受所有的失败,包括服务器、进程、通信以及媒体失败等等。
隔离性:一个事务处理对另一个事务处理没有影响。隔离的级别主要有四个:
serializable(串行化):可避免脏读、不可重复读、虚读情况的发生。
repeatable read(可重复读):可避免脏读、不可重复读情况的发生。(可重复读,是 mysql 默认的事务隔离级别)
read committed(读已提交):可避免脏读情况发生
read uncommitted (读未提交) :最低级别,以上情况均无法保证。(读取到了未提交的数据)
进行的操作 | 命令 |
---|---|
查看存储引擎 | SHOW CREATE TABLE 表名; |
更改引擎 | ALTER TABLE 表名 ENGINE=新引擎名 |
回滚 | ROLLBACK; |
声明事务开始 | START TRANSACTION; |
事务提交 | COMMIT; |
查询自动提交功能状态 | SELECT @@AUTOCOMMIT; |
设置自动提交功能 | SET AUTOCOMMIT=0或1; |
设置隔离级别 | SET SESSION TRANSACTION ISOLATION LEVEL 隔离级别; |
保存点 | SAVEPOINT |
隔离级别的选择
mysql默认可重复读,主要是由于binlog的主从备份的bug(bug原因可参考)
首先排除读未提交,逻辑上,一个事务读到另一个事务还未提交的状态是不合理的。
再来串行化的隔离级别是最高,但对于高并发很不友好,每次读操作都会加锁。
可重复读出现死锁的机率比读已提交大!
在读已提交时,MySQL做了优化,在MySQL Server过滤条件,发现不满足后,会调用unlock_row方法,把不满足条件的记录放锁。
在可重复读隔离级别下,走聚簇索引,进行全部扫描,最后会将整个表锁上。
来源:51CTO
作者:weixin_45627802
链接:https://blog.csdn.net/weixin_45627802/article/details/100972848