什么是事务?
多条语句必须同时执行成功或者同时执行失败,是数据库操作的一个执行单元。例如,删除字典中的一个字,需要删除目录中字的索引,同时也必须要删除正文中有关这个字的内容。在逻辑上必须同时增删改的一段命令称之为事物。
事务的四大特性
事务必须满足 4 个特性( ACID )
- 原子性/不可分割性( Atomicity )
一个事务中的所有操作是一个整体,要么全部成功,要么全部失败,不会结束于事物的中间。 - 一致性( Consistency )
一个事务内,有一个操作失败时,所有更改过对数据都必须回滚到更改前。 - 隔离性/独立性( Isolation )
一个事务查看数据时,数据所处的状态要么是另一并发事务修改它之前的状态,要么是修改后的状态,不会查看中间状态的数据。 - 持久性( 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;
事务隔离
事务隔离问题
并发事务时会引起以下问题:
- 脏读:脏读又称无效数据读出,一个事务读取另外一个事务还没有提交的数据叫脏读。
例如,事务A读取事务B更新的数据,然后B回滚操作,那么A读取到的是无效数据。 - 不可重复读:是指在数据库访问中,一个事务范围内两个相同的查询却返回了不同数据。
例如,事务A读取某一数据,事务B读取并修改了该数据,事务A再次读取该数据,却得到了不同的数据。 - 幻读:事务A读取与搜索条件相匹配的若干行。事务B以插入或删除行等方式来修改事务A的结果集,然后再提交。
例如,事务A将所有学生数值成绩更改为 优秀 良好 及格 差 等级成绩,然后事务B插入一条学生数值成绩,这时事务A会发现有一条记录没有更改,就好象发生了幻觉一样。一般解决幻读的方法是增加范围锁RangeS,锁定检索范围为只读,这样就避免了幻读。
事务隔离级别
事务隔离级别 | 脏读 | 不可重复读 | 幻读 | 说明 |
---|---|---|---|---|
读未提交 read uncommitted | √ | √ | √ | 最低的事务隔离级别,一个事务还没提交时,它做的变更就能被别的事务看到 |
不可重复读 read committed | × | √ | √ | 保证一个事物提交后才能被另外一个事务读取。另外一个事务不能读取该事物未提交的数据。 |
可重复读 repeatable read | × | × | √ | 多次读取同一范围的数据会返回第一次查询的快照,即使其他事务对该数据做了更新修改。事务在执行期间看到的数据前后必须是一致的。 |
序列化 serializable | × | × | × | 事务绝对隔离,花费最高代价但最可靠的事务隔离级别。 |
事务隔离查询与设置
查询隔离级别
SELECT @@tx_isolation;
设置隔离级别
SET SESSION TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;