学软件技术,读第一手资料,去官方网站:MySQL 5.7参考手册
也可以看看比较经典的书籍,如《高性能MySQL》等
1、事务通俗易懂的解释:多条语句(操作)要么全部执行成功,要么全部执行失败。
要么“全部执行失败”再解释下:假设总共4条语句,只要有其中1条执行失败了,那么就判定为“全部执行失败”。失败时,4条语句中已经执行成功的需要恢复成未执行这4条语句原来的样子。
举个例子:假设某银行的数据库中有2张表,支票(checking)表和储蓄(savings)表。小明(customer_id=12345)要从他的支票账户往他的储蓄账户转100元钱,那么需要三个步骤:
(1)检查小明的支票账户余额是否大于100元;
(2)从小明的支票账户减去100元;
(3)把小明的储蓄账户增加100元;
上面的三个步骤必须在一个事务中,也就是说,要么全部成功要么全部失败。只要任何一个步骤失败,就必须回滚所有操作,恢复成没有执行任何一条语句的样子。
事务的SQL如下:
1 START TRANSACTION;
2 SELECT balance FROM checking WHERE customer_id = 12345;
3 UPDATE checking SET balance = balance - 100.00 WHERE customer_id = 12345;
4 UPDATE savings SET balance = balance + 100.00 WHERE customer_id = 12345;
5 COMMIT;
假如没有在一个事务中,会出现啥情况呢?
(1)上面的第3条语句执行完(支票账号减少了100元),正要开始执行第4条语句,结果数据库系统崩溃了,假设这些语句不在一个事务中,那么就会出现,小明的支票账号减少了100元,储蓄账号没有增加100块,小明白白损失100元。
2、事务的4大特性
(1)原子性
一个事务必须视为一个不可分割的最小工作单元,要么全部成功提交操作,要么全部失败回滚造作。
(2)一致性
数据库总是从一个一致性的状态转换到另一个一致性的状态。
不会出现上面说的:第3条语句执行完(支票账号减少了100元),正要开始执行第4条语句,结果数据库系统崩溃了,小明的支票账号减少了100元,储蓄账号没有增加100块,小明白白损失100元。
因为第4句和第5句没有执行,事务最终没有提交,所以所做的修改不会保存到数据库中。
(3)隔离性
一个事务所做的修改在最终没有提交之前,对其他的事务是不可见的。
例如:第3条语句执行完(支票账号减少了100元),还没有执行第4条语句,因为没有提交,所以此时的其他线程是看不到支票账号减少100元的。
(4)持久性
一旦事务提交(第5句执行完),则所做的所有修改就会永久保存到数据库中。此时即使系统崩溃,修改的数据也不会丢失。