Mysql 事务 异常 事务隔离的级别 事务 在你操作数据库的同时,有可能其他用户还会不断地对数据进行增删改查操作。为了避免并行进行时出现混乱,就产生了“事务”。事务就是要保证一组数据库操作,要么全部成功要么全部失败,以此来保
在你操作数据库的同时,有可能其他用户还会不断地对数据进行增删改查操作。为了避免并行进行时出现混乱,就产生了“事务”。事务就是要保证一组数据库操作,要么全部成功要么全部失败,以此来保证不混乱。
事务支持是在引擎层
实现的,mysql支持多系统,不是所有引擎都支持事务。
原子性是基础,一致性是约束,隔离性是手段,持久性是目的。
Mysql默认autocommit = 1
,compelation = 0
autocommit = 1
:每条SQL都自动提交
autocommit = 0
:不论是否使用START TRANSACTON
或BEGIN
,总要使用commit
才能提交。有些客户端框架会默认连接后先执行set autocommit = 0
的命令。这就容易造成长连接,从而造成长事务。
尽量不要长事务,详见"可重复读的实现"
compelation = 0
:执行commit仅提交事务
compelation = 1
:commit时相当于commit and chain
,开启链式事务,提交事务后开启一个相同的事务
compelation = 2
: commit时相当于commit and release
,提交后会自动断开服务器连接
在MySQL默认的设置下
使用START TRANSACTION
或BEGIN
显式开启一个事务,然后再用COMMIT
提交
使用ROLLBACK
进行回滚,或者回滚到ROLLBACK TO [SAVEPOINT]
。例如,在一个事务中为有唯一约束(包含主键)的字段插入了 多条有相同值的该字段记录。 那么,在mysql默认情况下就会产生错误,再执行ROLLBACK后就会只有未插入前的数据。如下列代码,执行后前后查询结果一致。
SELECT * FROM t;
...
BEGIN;
INSERT INTO t id VALUES 1;
INSERT INTO t id VALUES 1;
ROLLBACK;
SELECT * FROM t;
需要注意的是,插入错误后只有手动ROLLBACK
后才会执行后前后查询结果一致
,不执行ROLLBACK的结果是后面的查询结果会比前面多一条id为1的记录。
隔离得越严实,效率就会越低,我们需要在生产中寻找一个平衡点,按业务决定。
对于隔离级别从低到高分别是
读未提交(READ UNCOMMIT) --- 允许读到未提交的数据 --- 不使用锁,无法避免三种异常
读已提交(READ COMMIT) --- 只能读到已提交的数据 --- 其本身可避免脏读(也是oracle和SQL
Server默认的隔离级别) --- 可以编写带锁的SQL语句来避免“不可重复读”和“幻读”
可重复读(REPEATABLE READ) --- 事务在执行期间看到的数据必须前后一致 --- 避免 “脏读”和“不可重复读” (是MySQL默认的隔离级别)
可串行化(SERIALIZABLE)--- 将所有事务串行化,是最高隔离等级,可以避免所有异常,但是牺牲了并发性
隔离级别效用说明例题:
查询mysql当前的隔离等级
mysql> show variables like "transaction_isolation";
+-----------------------+-----------------+
| Variable_name | Value |
+-----------------------+-----------------+
| transaction_isolation | REPEATABLE-READ |
+-----------------------+-----------------+
1 row in set (0.02 sec)
隔离的实现主要有读写锁
和多版本并发处理(mvcC)
两种方式。(因为读写锁降低了事务并发效率,为了让读写之间也不冲突,就发明了MVCC)
事务隔离的实现拓展阅读见此处,有一定了解后再整理自己的版本
下面简单介绍MVCC利用ReadView(快照)实现可重复读
MySQL中每条记录在更新的时候都会同时记录一条回滚日志
在将1依次改为2,3,4的过程中,回滚日志有如下记录
ReadView_A:将2改为1
ReadView_B:将3改为2
ReadView_C:将4改为3
而当前:
值为4
这就让同一条记录在系统中可以有多个版本
,这就是MVCC,此时如果有"将4改为5"的事务,它并不会影响回滚日志中的A、B、C。
尽量不要使用长事务
:长事务意味着有很多旧的ReadView(影响回滚空间,5.5之前甚至有可能回滚空间大于真实数据),这会导致占用大量的存储空间,而且长事务还会占用锁资源,有可能拖垮整个库。
删除回滚日志:默认情况下,系统会自行判断,当没有事务需要用到这些回滚日志时就会被删除。在上述例子中,如果修改为4之后就commit(相当短的事务),即会造成“没有事务需要用到这些回滚日志”,上述回滚日志就会被删除。
也就是说事务未提交前可以回滚,提交后回滚日志会被删除(5.7实验通过)
--结束END--
本文标题: MySQL 事务 异常 事务隔离的级别 - G
本文链接: https://www.lsjlt.com/news/6887.html(转载时请注明来源链接)
有问题或投稿请发送至: 邮箱/279061341@qq.com QQ/279061341
下载Word文档到电脑,方便收藏和打印~
2024-04-28
2024-04-28
2024-04-28
2024-04-28
2024-04-28
2024-04-28
2024-04-28
2024-04-28
2024-04-28
2024-04-28
回答
回答
回答
回答
回答
回答
回答
回答
回答
回答
0