赞
踩
文章目录
事务是一个最小的不可在分的工作单元;通常一个事务对应一个完整的业务(例如银行账户转账业务,A转给B50元,A账户-50,B账户+50整个业务流程是一个事务)
建表的时候,选择 Innodb引擎才支持事务
开启事务(start transaction)
执行sql操作(普通sql操作)
提交/回滚(commit/rollback)
#开启手动处理事务模式
#set autocommit = false;
#开始事务(推荐)
start transaction;
#查看当前表的数据
select * from t_stu_detail;
#删除整张表的数据
delete from t_stu_detail;
#查询该表数据,发现显示删除后的结果
select * from t_stu_detail;
#回滚
rollback
#查看当前表的数据,发现又回来了
select * from t_stu_detail;
#删除整张表的数据
delete from t_stu_detail;
#提交事务
commit;
#查看当前表的数据,发现真删除了
select * from t_stu_detail;
对于同时运行的多个事务(多线程并发), 当这些事务访问数据库中相同的数据时, 如果没有采取必要的隔离机制, 就会导致各种并发问题: (问题的本质就是线程安全问题,共享数据的问题)
脏读是指在一个事务处理过程里读取了另一个未提交事务中的数据。
例如A转给B50元,在执行到A账户增加时,B查看账户发现确实多出了50元。如果该事务执行失败进行回滚,最终B查看会发现账户里的钱并没有增加。
- update account set money=money+50 where name=’B’; (此时A通知B)
-
- update account set money=money-50 where name=’A’;
事务A首先读取了一条数据,然后执行逻辑的时候,事务B将这条数据改变了,然后事务A再次读取的时候,发现数据不匹配了,就是所谓的不可重复读了。不可重复读主要是针对某条数据的UPDATE操作。
- 事务1:
- select account where name='B'(此时事务2修改并提交了B)
-
- select account where name='B'(此时获取的account和第一次获取到的值不相同)
-
- 事务2:
- update account set money=money+50 where name=’B’;
事务A首先根据条件索引得到N条数据,然后事务B改变了这N条数据之外的M条或者增添了M条符合事务A搜索条件的数据,导致事务A再次搜索发现有N+M条数据了,就产生了幻读。幻读主要是对应INSERT操作,事务读第一次取到的数据比后来读取到数据条目不一致。
Read uncommitted (读未提交)
就是一个事务可以读取另一个未提交事务的数据,也就是发生了脏读。
Read committed (读已提交):可避免脏读的发生。
一个事务要等另一个事务提交后才能读取数据,可以避免脏读,但是不能避免不可重复度、幻读。
Repeatable read (可重复读):可避免脏读、不可重复读的发生。*MySQL默认隔离级别
重复读,就是在开始读取数据(事务开启)时,不再允许修改操作。
分析:重复读可以解决不可重复读问题,不可重复读对应的是修改,即UPDATE操作。但是可能还会有幻读问题。因为幻读问题对应的是插入INSERT操作,而不是UPDATE操作。
Serializable (序列化):可避免脏读、不可重复读、幻读的发生。
Serializable 是最高的事务隔离级别,在该级别下,事务串行化顺序执行,可以避免脏读、不可重复读与幻读。但是这种事务隔离级别效率低下,比较耗数据库性能,一般不使用。
参考:
Copyright © 2003-2013 www.wpsshop.cn 版权所有,并保留所有权利。