1.事务
1>什么是事务管理
事务是数据库中的最小执行单元,不可拆分,要么全都执行成功,要么全都执行失败。
2>手动事务管理
事务管理:开启事务--提交事务/事务回滚 数据库中事务管理默认开启的。 -增删改执行时,在他们执行之前,事务自动开启,执行成功,事务自动提交。 -查不涉及事务 -如何查看数据库的事务管理是否开启? show variables like 'autocommit'; -设置事务管理关闭 set autocommit=off; -事务相关命令: begin: 开启事务 commit:提交事务 rollback:事务回滚
3>事务的特点
原子性:事务是最小执行单元,不可再分,要么全都成功,要么全都执行失败。 一致性:事务从一个valid(有效的)状态切换成另个一个有效的状态。 隔离性:事务之间彼此隔离的,互不影响(是指事务的内部对外不可见)。 持久性:事务提交后,所做的操作会持久化到数据库中。
4>事务的隔离级别
读未提交:read uncommited
事务未提交和回滚前对外可见,会产生脏读问题。
读已提交:read commited(修改)
隔离级别为读已提交,解决了脏读问题,但是产生新的问题:不可重复读 不可重复读产生的原因:在事务A执行期间,其他事务对用户1的数据进行了修改 如何解决不可重复读问题:给事务操作的数据加锁
可重复读:repeatable read(增删)
给事务操作的数据加锁
产生的问题:可重复读可以解决不可重复读的问题,但是会产生幻读。
幻读产生的原因:事务A执行期间,允许其他事务对表进行了增删操作,从而导致幻读,
解决办法:给表加锁
可串行化:serializable
解决方案:增加表锁,查询时不允许其他事务进行增删操作,由此解决了幻读的问题
隔离级别以及可能会产生的问题
脏读 | 不可重复读 | 幻读 | |
---|---|---|---|
读未提交 | √ | √ | √ |
读已提交 | × | √ | √ |
可重复读 | × | × | √ |
可串行化 | × | × | × |
注意: 不可重复读和幻读很像,都是同一个事务中前后两次查询的数据不一致。 不可重复读是前后查询到同一条数据不同,针对的是修改操作 幻读是前后两次查询到的数据总量不同,针对的是增删操作 特点:隔离级别最高,并发执行效率是越低
数据库默认的隔离级别
mysql默认的隔离级别是可重复读 sql server 和 oracle的默认隔离级别均为读已提交 注意:mysql的隔离级别为可重复读,但是不会产生幻读,如何解决幻读的? mysql在事务中会采用快照读保留事务第一次查询到的数据,后续若再 次执行相同的查询,直接读取快照即可。