1
2 1------------吾亦无他,唯手熟尔,谦卑若愚,好学若饥-------------
2
事务
事务是什么?
我记得当初的百度百科上讲,事务是执行的
最小逻辑单元,它们要么
都执行,要么
都不执行
(同生共死)
事务解决什么问题?
简单的提一个小例子,就转账,先把你钱扣掉了,但中途发生点不可抗拒的因素,结果没转过去,那么如果没有回滚,那么你就白白损失这钱,如果银行先给那个人转达了,但中途发生点问题,你的钱没扣,那银行损失惨重,所以这就需要事务,要么都执行,要么都不执行
事务的
四个特性:
**
原子性:都要确保不可再分的最小单元**
**
一致性:指的是结果要么都成功提交,要么都回滚,一致的**
**
持久性:事务完成后,会永久的保存到数据库,而不是说你今天有,明天就没了**
**
隔离性:多个事务之间互不影响**
并发事务会造成的问题:
第一类
丢失更新:撤销一个事务时,把其他事务已提交的更新数据覆盖。
第二类
丢失更新:是不可重复读的特殊情况。如果两个事物都读取同一行,然后两个都进行写操作,并提交,第一个事物所做的改变就会丢失。
**
脏读:一个事务读取到另一个事务未提交的更新数据。**
**
幻读也叫虚读:一个事务执行两次查询,第二次结果集包含第一次中没有或某些行已经被删除的数据,造成两次结果不一致,只是另一个事务在这两次查询中间插入或删除了数据造成的。**
**
不可重复读:一个事务两次读取同一行的数据,结果得到不同状态的结果,中间正好另一个事务更新了该数据,两次结果相异,不可被信任。**
事物的四个
如何解决这些问题?answer:
事物的隔离级别
①
Serializable (串行化):可避免脏读、不可重复读、幻读的发生。
②
Repeatable read (可重复读):可避免脏读、不可重复读的发生。
③
Read committed (读已提交):可避免脏读的发生。
④
Read uncommitted (读未提交):最低级别,任何情况都无法保证。
其中
Sql Server和Oracle是读已提交,
mysql是可重复读,他们隔离级别不同,
性能也不同,随然串行化避免的问题最多,但是性能太差,大多数时候要
根据实际业务进行取舍
事务的七个传播行为:
1、
PROPAGATION_REQUIRED:如果当前没有事务,就创建一个新事务,如果当前存在事务,就加入该事务,该设置是最常用的设置。
2、
PROPAGATION_SUPPORTS:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就以非事务执行。‘
3、
PROPAGATION_MANDATORY:支持当前事务,如果当前存在事务,就加入该事务,如果当前不存在事务,就抛出异常。
4、
PROPAGATION_REQUIRES_NEW:创建新事务,无论当前存不存在事务,都创建新事务。
5、
PROPAGATION_NOT_SUPPORTED:以非事务方式执行操作,如果当前存在事务,就把当前事务挂起。
6、
PROPAGATION_NEVER:以非事务方式执行,如果当前存在事务,则抛出异常。
7、
PROPAGATION_NESTED:如果当前存在事务,则在嵌套事务内执行。如果当前没有事务,则执行与PROPAGATION_REQUIRED类似的操作。
在mysql中如何查看事物的隔离级别:
1
2 1SELECT @@tx_isolation;
2
在mysql中如何修改事务的隔离级别:
1
2
3
4
5
6
7
8 1SET [GLOBAL | SESSION] TRANSACTION ISOLATION LEVEL
2 {
3 REPEATABLE READ
4 | READ COMMITTED
5 | READ UNCOMMITTED
6 | SERIALIZABLE
7 }
8
如果写GLOBAL就是全局
如果是SESSION就是当前回话