事务(transaction)其实就是一序列数据库命令,他们可以组合在一起当做一个单一逻辑单元
在一个事务被标记为完成之前(commited),任何改变可以被回滚(rolled back)
例子:转账,它可以包括(减少发送钱账户的金额量,增加收款人的金额量,给发送方和接收方都增加交易记录)
如果连接被打断,或者说一些操作失败了,所有的操作都需要被回滚
→ Total failure is better than partial failure
每一个事务的终止信号都是通过commit或者roll back来传达的,没有commit,我们做出的改变不会被保存
但其实Sesssions都是有自动提交功能(auto-commit)的,也就是任何命令都能被马上提交,不需要roll back和commit,这种auto-commit方式都是被默认的(set sutocommit = 0 关闭autocommit)
→ START TRANSACTION or BEGIN
BEGIN;
UPDATE accounts SET balance = balance - 100.00 WHERE acc_nr = 254231426;
UPDATE accounts SET balance = balance + 100.00 WHERE acc_nr = 676535301;
INSERT INTO transfers (acc_nr, amount, reference) VALUES (254231426, -100.00, ’Dentist’);
INSERT INTO transfers (acc_nr, amount, reference) VALUES (676535301, 100.00, ’John Smith’);
COMMIT;
同时事务:
复杂情况:多种同时事务
情况1:按顺序执行事务
很简单去实行,在一些情况下工作的很好
但是有时过慢了:
CPU可以保持空闲当I/O转换过程中,反之亦然
慢的语句可能会阻碍快的那个
事务可能需要去等待用户输入