mysql 事务处理

匿名 (未验证) 提交于 2019-12-02 22:06:11

数据库引擎

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方法,把不满足条件的记录放锁。
在可重复读隔离级别下,走聚簇索引,进行全部扫描,最后会将整个表锁上。

易学教程内所有资源均来自网络或用户发布的内容,如有违反法律规定的内容欢迎反馈
该文章没有解决你所遇到的问题?点击提问,说说你的问题,让更多的人一起探讨吧!