黑龙江企业网站建设,做网站用最新软件,电子商务网站建设的要求,北大荒建设集团网站Mysql 中的事务分为手动提交和自动提交#xff0c;默认是自动提交#xff0c;所以我们在Mysql每输入一条语句#xff0c;其实就会被封装成一个事务提交给Mysql服务端。
手动提交需要先输入begin#xff0c;表示要开始处理事务#xff0c;然后就是常见的sql语句操作了默认是自动提交所以我们在Mysql每输入一条语句其实就会被封装成一个事务提交给Mysql服务端。
手动提交需要先输入begin表示要开始处理事务然后就是常见的sql语句操作了操作完毕以后锁看到的都是临时处理结果最后需要输入commit才会真正更新到磁盘。 目录
1、什么是事务
2、事务为什么要有隔离性
3、隔离级别的分类
(1) 读未提交Read Uncommitted
(2) 读提交Read Committed
(3) 可重复读Repeatable Read
(4) 串行化Serializable 1、什么是事务
我们在火车站买票买票和取票的过程可以看做是一个完整的过程不可能买了票就走人。但是站在售票员的角度有人来买票以及取票需要做两个不同的动作预定座位和发放纸质车票
换到Mysql我们作为用户我们买到票以后取票这就是一个事务站在Mysql的角度事务不过是多个sql语句的集合第一条sql语句预定位置第二条sql语句查询并打印车票。 2、事务为什么要有隔离性
仍然以买票为例不同售票窗口虽然服务的是不同用户但是访问的是同一个数据库一个窗口刚好在办理售票业务即预定位置但是此时突然另一个窗口也要预定位置这两个并发的业务都要预定位置但是位置只有一个但是也不能让这两个业务同时成功。
因此事务具有隔离性的原因是避免并发带来的不一致性为防止两个事务相互影响才有了四种隔离级别。 3、隔离级别的分类
Mysql 下的并发是不可避免的不同的场景下对并发的接受程度也会不一样比如买票就不允许两个人买到同一个座位但如果是商店购物两个人同时要来结账依次处理结账事务是完全可以接受的。
依据不同的场景Mysql允许不同程度的并发干扰也就是隔离级别Mysql 下的隔离级别有4种
读未提交 【Read Uncommitted】读提交 【Read Committed】可重复读 【Repeatable Read】串行化 【Serializable】
(1) 读未提交Read Uncommitted
意义在该隔离级别下可以看到其他事务尚未提交的执行结果。
存在的问题这种情况下其他事务会受到临时执行结果的影响如果线程B读取到线程A没有提交的事务我们称之为“脏读”。这种级别相当于没有隔离性因为线程A在提交事务之前随时都可以取消当前事务。 注意一个事务在执行中读到另一个执行中事务的更新(或其他操作)但是未commit的数据这种现象叫做脏读
(2) 读提交Read Committed
意义该隔离级别是大多数数据库的隔离级别不是MySQL默认的。一个事务可以读取到其他事务提交以后的结果或者说事务处理结束的结果
存在的问题这种情况下存在一定的问题比如事务线程B执行到某个 if 判断语句其他事务把当前 if 语句的判断条件改变了这就直接影响到了当前事务的逻辑判断。我们把这种情况称为“不可重复读”。 (3) 可重复读Repeatable Read
意义MySQL默认的隔离等级当前正在执行的事务无法看到其他事务的任何执行结果无论是临时还是提交结果直至当前事务提交执行结束。一定程度上解决了上面读提交引起的“不可重复读”问题。
注意事项其他事务 insert 的数据可以被当前正在执行的事务读取到导致查询时会多出新的记录这种现象叫做“幻读”如果出现了幻觉一般。但是MySQL在该级别下是解决了幻读问题的采用的方式为 Next-Key 锁。 (4) 串行化Serializable
意义所有的事务按照顺序依次处理不会存在并发问题但是效率极低。一般不会采用