MySQL事务处理与事务隔离

什么是事务?

多条语句必须同时执行成功或者同时执行失败,是数据库操作的一个执行单元。例如,删除字典中的一个字,需要删除目录中字的索引,同时也必须要删除正文中有关这个字的内容。在逻辑上必须同时增删改的一段命令称之为事物。

事务的四大特性

事务必须满足 4 个特性( ACID )

  1. 原子性/不可分割性( Atomicity )
    一个事务中的所有操作是一个整体,要么全部成功,要么全部失败,不会结束于事物的中间。
  2. 一致性( Consistency )
    一个事务内,有一个操作失败时,所有更改过对数据都必须回滚到更改前。
  3. 隔离性/独立性( Isolation )
    一个事务查看数据时,数据所处的状态要么是另一并发事务修改它之前的状态,要么是修改后的状态,不会查看中间状态的数据。
  4. 持久性( Durability )
    事务处理完成后,对数据的修改就是永久性的。

事务处理的结构

开始      START TRANSACTION 或 BEGIN
             具体业务…
             …
             …
结束      ROLLBACK 事务回滚 或 COMMIT 提交事务

mysql 中 是默认提交,可通过 SET 修改自动提交模式

SET AUTOCOMMIT = 0 #关闭自动提交
SET AUTOCOMMIT = 1 #开启自动提交

存储引擎

查看引擎

SHOW ENGINES;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine             | Support | Comment                                                        | Transactions | XA   | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| InnoDB             | DEFAULT | Supports transactions, row-level locking, and foreign keys     | YES          | YES  | YES        |
| MRG_MYISAM         | YES     | Collection of identical MyISAM tables                          | NO           | NO   | NO         |
| PERFORMANCE_SCHEMA | YES     | Performance Schema                                             | NO           | NO   | NO         |
| BLACKHOLE          | YES     | /dev/null storage engine (anything you write to it disappears) | NO           | NO   | NO         |
| CSV                | YES     | CSV storage engine                                             | NO           | NO   | NO         |
| MyISAM             | YES     | MyISAM storage engine                                          | NO           | NO   | NO         |
| ARCHIVE            | YES     | Archive storage engine                                         | NO           | NO   | NO         |
| MEMORY             | YES     | Hash based, stored in memory, useful for temporary tables      | NO           | NO   | NO         |
| FEDERATED          | NO      | Federated MySQL storage engine                                 | NULL         | NULL | NULL       |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
9 rows in set (0.00 sec)

InnDB引擎 支持事务处理,默认引擎也是InnoDB,也可用下面语句更改为InnoDB引擎;

ALTER TABLE table ENGINE = InnoDB;

事务隔离

事务隔离问题

并发事务时会引起以下问题:

  1. 脏读:脏读又称无效数据读出,一个事务读取另外一个事务还没有提交的数据叫脏读。
    例如,事务A读取事务B更新的数据,然后B回滚操作,那么A读取到的是无效数据。
  2. 不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。
    例如,事务A读取某一数据,事务B读取并修改了该数据,事务A再次读取该数据,却得到了不同的数据。
  3. 幻读:事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。
    例如,事务A将所有学生数值成绩更改为 优秀 良好 及格 差 等级成绩,然后事务B插入一条学生数值成绩,这时事务A会发现有一条记录没有更改,就好象发生了幻觉一样。一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。

事务隔离级别

事务隔离级别脏读不可重复读幻读说明
读未提交 read uncommitted最低的事务隔离级别,一个事务还没提交时,它做的变更就能被别的事务看到
不可重复读 read committed×保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。
可重复读 repeatable read××多次读取同一范围的数据会返回第一次查询的快照,即使其他事务对该数据做了更新修改。事务在执行期间看到的数据前后必须是一致的。
序列化 serializable×××事务绝对隔离,花费最高代价但最可靠的事务隔离级别。

事务隔离查询与设置

查询隔离级别

SELECT @@tx_isolation;

设置隔离级别

SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值