目录
什么是事务
事务是一组操作的集合,它是一个不可分隔的工作单位
事务会把所有的操作作为一个整体一起向系统提交或撤销操作请求
从事务开始直到用户执行COMMIT或者ROLLABACK为止算作一个事务
即:将多个操作绑定到一起,这些操作要么同时成功,要么同时失效
事务操作(创建事务)
默认MySQL的每一条语句就是一个事务,并且事务会自动提交
如果要自定义事务,可以进行以下操作
方式一:修改事务为手动方式,手动提交事务
查看事务的提交方式
SELECT @@autocommit;
显示结果为1表示自动提交,为0表示手动提交
设置事务的提交方式
SET @@autocommit=0;
设置事务手动提交;只针对当前窗口(会话)生效
提交事务
COMMIT;
一旦提交事务,就无法恢复到事务开始前的状态
回滚事务
ROLLBACK;
在事务提交前,取消事务包含的全部指令,相当于文件处理中的放弃保存
如果在执行事务中某个指令中出现了异常,可以执行回滚事务,保证数据库数据的正确性和完整性
#张三给李四转账1000元
select * from account where name='张三'; #查询张三的余额
update account set money = money - 1000 where name='张三'; #将张三减1000
update account set money = money + 1000 where name='李四'; #将李四加1000
commit; #提交事务
方式二 不修改事务的执行方式
开启事务
START TRANSACTION; 或者 BEGIN;
提交事务
COMMIT;
回滚事务
ROLIBACK;
#张三给李四转账1000元 start transaction; #开启事务 select * from account where name='张三'; #查询张三的余额 update account set money = money - 1000 where name='张三'; #将张三减1000 update account set money = money + 1000 where name='李四'; #将李四加1000 commit; #提交事务
事务的四大特性(ACID)
原子性(Atomicity)
一个事务中的操作,要么全部成功,要么全部失败
一致性(完整性)(Consistency)
事务中包含的操作要满足数据库提前设置的约束,违反约束的操作回执行失败
事务完成时,必须使所有的数据都保持一致状态
隔离性(Isolation)
数据库系统提供的隔离机制保证事务在不受外部并发操作影响的独立环境下运行
保证不同事务之间互不干扰(要解决并发事务引起的问题)
持久性(Durability)
事务一旦提交或回滚,它对数据库中的改变就是永久的,无法撤回;如果系统出现故障导致数据丢失,也可以通过某些手段进行恢复
进行数据恢复的手段一般是将事务的执行记录(日志)保存在硬盘等存储介质中,当发生故障时可以通过日志恢复到故障发生前的状态
事务的隔离级别
解决并发事务的问题
事务的隔离级别(重Read Unco到Seri,安全级别越高,并发性能越差)
Read uncommitted(读未提交) 无法解决并发事务的问题
Read committed(读已提交) 可以解决脏读问题
Repeatable Read(可重复读 MySql的默认隔离级别) 可以解决脏读和不可重复读问题
Serializable(可串行化) 可以解决脏读、不可重复读、幻读问题(同时只允许一个事务操作)
查看事务隔离级别
SELECT @@TRANSACTION_ISOLATION;
设置事务隔离级别
SET [SESSION / GLOBAL] TRANSACTION ISOLATION LEVEL 事务隔离级别;
并发事务问题
脏读问题
一个事务读到另一个事务还没有提交的数据
不可重复读问题
一个事务先后读取同一条记录,但两次读取的数据不同
两种情况:
- 事务A出现脏读问题,事务B没有提交,引起脏读和不可重复读问题(如上图所示)
- 事务A没有出现脏读问题,而是在事务B更改提交后,出现了不可重复读问题(如下图所示)
幻读问题
一个事务按照条件查询查询数据时,没有对应的数据行;但是在插入数据时,又发现这行数据已经存在了