引入
a和b,a向b转100w
a钱-100w(北京),b钱+100w(武汉)
网络突然断了,a扣减100w,此时网络断掉,b没有获得钱?
事务四个特性(ACID)
- 原子性
- 一个事务(transaction)中的所有操作,要么全部完成,要么全部不完成,不会结束在中间某个环节。
- 一致性
- 事务开始之前和事务结束之后,整体的结果不会发生变化
- 隔离性
- 数据库允许多个并发事务同时对其数据进行读写和修改的能力,隔离性可以防止多个事务并发执行时由于交叉执行而导致数据的不一致。事务隔离分为不同级别,包括读未提交(Read uncommitted)、读提交(read committed)、可重复读(repeatable read)和串行化(Serializable)
- 持久性
- 事务处理结束后,对数据的修改就是永久的,即便系统故障也不会丢失
- 关系数据库最大特点,数据操作成功,数据落地,保存到磁盘中
数据库分类
- 关系型数据库
- Oracle、MySQL、SQLServer,支持事务
- 非关系型数据库
- redis分布式内存数据库,mongodb,hbase,大多不支持事务
事务相关语句
- autocommit 开关,是否自动提交事务,mysql默认打开,oracle默认关闭,打开值为1,关闭为0
- SAVEPOINT 设置保存点
- 操作:全部成功 commit 提交,失败就 rollback 回滚
#没有设置检查点
SET @@autocommit = 0; #关闭自动提交,否则每执行一条语句,就提交,提交后不可更改,执行错了也无法回滚
BEGIN; #事务开始
UPDATE emp SET salary = salary - 1000 WHERE NAME = 'hu'; #操作1,设置用户hu工资减少1000
UPDATE emp SET salary = salary + 1000 WHERE NAME = 'iu'; #操作2,设置用户iu工资增加1000
#COMMIT; #正常提交
ROLLBACK; #回滚到begin
#设置检查点iu
SET @@autocommit = 0; #关闭自动提交
BEGIN; #事务开始
UPDATE emp SET salary = salary -1000 WHERE NAME = 'hu'; #操作1,设置用户hu工资减少1000
SAVEPOINT iu; //设置保存点
UPDATE emp SET salary = salary +1000 WHERE NAME = 'iu'; #操作2,设置用户iu工资增加1000
ROLLBACK TO iu; #回滚到保存点iu位置上
#修改和删除数据,在之前设置检查点,出错了还可以回滚。
SET @@autocommit = 0; #关闭自动提交
BEGIN; #事务开始
SAVEPOINT iu; #设置保存点
DELETE FROM emp; #删除
#COMMIT; #删除正确
ROLLBACK TO iu; #删除错误,回滚
总结
- 如果数据库处理有多个SQL语句,非查询SQL,此时需要事务
- 事务会造成一定性能损耗,一般不推荐