事务控制语言
Transaction Control Language
一、事务的概念
- 事务:一个或一组sql语句组成一个执行单元,这个执行单元要么全部执行,要么全部不执行。单元中的每条sql语句是相互依赖的。如果单元中某一条语句一旦执行失败或产生错误,真个单元将回滚,所有受到影响的数据将返回原来的状态。
- 存储引擎:(表类型)在mysql中的数据用各种不同的技术存储在文件/内存中。
使用 show engines;查看mysql支持的存储引擎
mysql> show engines;
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| Engine | Support | Comment | Transactions | XA | Savepoints |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
| FEDERATED | NO | Federated MySQL storage engine | NULL | NULL | NULL |
| MRG_MYISAM | YES | Collection of identical MyISAM tables | NO | NO | NO |
| MyISAM | YES | MyISAM storage engine | 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 |
| MEMORY | YES | Hash based, stored in memory, useful for temporary tables | NO | NO | NO |
| ARCHIVE | YES | Archive storage engine | NO | NO | NO |
| InnoDB | DEFAULT | Supports transactions, row-level locking, and foreign keys | YES | YES | YES |
| PERFORMANCE_SCHEMA | YES | Performance Schema | NO | NO | NO |
+--------------------+---------+----------------------------------------------------------------+--------------+------+------------+
mysql中用的最多的存储引擎有:innodb,myisam,memory等。其中,innodb支持事务,而myisam memory不支持事务。
二、事务的属性(ACID)
原子性 一个事务包含多个操作,这些操作要么全部执行,要么全都不执行。实现事务的原子性,要支持回滚操作,在某个操作失败后,回滚到事务执行之前的状态。
一致性 事务必须使数据库从一个一致状态变换到另外一个一致状态
隔离性 多个事务之间不能互相干扰,需要隔离级别
持久性 事务一旦被提交,永久改变数据库的数据
三、事务的创建
隐式使用:事务没有明显的开始和结束的标记
比如:insert、update、delete
显示事务:
前提:必须先设置自动提交功能为禁用
set autocommit = 0;
步骤1:开启事务
set autocommit = 0;
start transaction;可选
步骤2: 编写事务中的sql语句(select insert update delete)
语句1
语句2
·····
步骤3: 结束事务
commit; 提交事务
rollback; 回滚事务
# 四、设置隔离级别
read uncommitted: 出现脏读,不可重复读,幻读
read committed:避免脏读,出现不可重复读,幻读
repeatable read: 避免脏读,不可重复读,出现幻读
serializable : 都可以避免
mysql支持4种级别,默认级别为repeatable read
每次启动一个mysql程序,就会获得一个单独的数据库连接,每个数据库连接都有一个全局变量@@tx_isolation,表示当前的事务隔离级别。
查看当前的隔离级别:SELECT @@tx_isolation
```mysql
mysql> SELECT @@tx_isolation
-> ;
+-----------------+
| @@tx_isolation |
+-----------------+
| REPEATABLE-READ |
+-----------------+
1 row in set (0.05 sec)
设置当前的mysql连接的隔离级别:
set transaction isolation level read committed;
设置数据库系统的全局的隔离级别:
set global transaction isolation level read committed;
savepoint : 设置保存点