在实际开发中,SQL中最常用的一种就是事务了,事务全称为Transaction Control Language,事务控制语言,简称TCL。上面说到的事务,它的概念就是:事务由单独单元的一个或多个SQL语句组成,在这个单元中每个SQL语句是互相依赖的。而整个单独单元作为一个不可分割的整体,如果单元中某条SQL语句执行失败或产生错误,整个单元将会回滚,所有受到影响的数据将返回到事务开始以前的状态,如果单元中的所有SQL语句执行成功,则事务被顺利执行。在MySQL中InnoDB存储引擎支持事务,而MyISAM与MEMORY存储引擎不支持事务。显示MySQL储存引擎的SQL:
事务有四个特点,简称ACID属性,具体是:①原子性(Atomicity):原子性是指事务是一个不可分割的工作单位,事务中的操作要么都发生,要么都不发生;②一致性(Consistency):事务必须使数据库从一个一致性状态变换到另一个一致性状态;③隔离性(Isolation):事物的隔离性是指一个事务的执行不能被其他事务干扰,即一个事务内部的操作及使用的数据对并发的其他事务是隔离的,并发执行的各个事务之间不能互相干扰;④持久性(Durability):持久性是指一个事务一旦被提交,他对数据库中数据的改变就是永久性的,接下来的其他操作和数据库故障不应该对其有任何影响。MySQL中事务是默认开启的,如果需要单独设置一段事务的代码,需要先设置事务关闭,再去编写SQL语句,具体SQL如下:SET autocommit = 0;
START TRANSACTION; (可选)
编写事务中的SQL语句(select、insert、update、delete)
COMMIT; 提交事务
ROLLBACK; 回滚事务
事务成功就是提交事务,事务失败就是回滚事务。事务示例如下:
# 事务提交
SET autocommit = 0;
START TRANSACTION;
UPDATE account SET balance = 500 WHERE id = 1;
UPDATE account SET balance = 2500 WHERE id = 2;
COMMIT;
-- 事务回滚
SET autocommit = 0;
START TRANSACTION;
UPDATE account SET balance = 1500 WHERE username = '张三';
UPDATE account SET balance = 3500 WHERE username = '李四';
ROLLBACK;
对于同时运行多个事务的情况,当这些事务访问数据库中相同的数据时,如果没有采取必要的隔离机制,就会导致并发问题,具体导致的问题如下:①脏读:对于两个事务T1、T2,T1读取了已经被T2更新但还没有被提交的字段之后,若T2回滚,T1读取的内容就是临时无效的;②不可重复读:对于两个事务T1、T2,T1读取了一个字段,然后T2更新了该字段之后,T1再次读取同一个字段,值就不同了;③幻读:对于两个事务T1、T2,T1从一个表中读取了一个字段,然后T2在该表中插入了一些新的行之后,如果T1再次读取同一个表就会多出几行。为了保证数据库中事务的并发不出现问题,所以数据库有了隔离级别,一个事务与其他事务隔离的程度就是隔离级别,隔离级别越高,数据的一致性就越好,但并发性就越弱。MySQL支持下面的四种隔离级别。

SET TRANSACTION ISOLATION LEVEL 隔离级别;
SET SESSION|GLOBAL TRANSACTION ISOLATION LEVEL 隔离级别;
SET autocommit = 0;
START TRANSACTION;
DELETE FROM stuInfo WHERE id = 20;
SAVEPOINT A; # 设置保存点
DELETE FROM stuInfo WHERE id = 22;
ROLLBACK TO A; -- 回滚到保存点
运行结果是id=22没有被删除,而id=20的被删除了。