1. 什么是事物?
-
事物就是一组sql语句的组合来完成一个任务,这组语句在逻辑上存在相关性,要么全部成功,要么全部失败,他们是一个整体。
-
比如向别人转账,需要在我的账户update减去一定数额,然后在别人的账户update加上对应数额。两条update分开没有实际意义,但是组合后就变成了转账。
-
事物是为了应用层服务的,并非数据库天生具有的。
-
mysql中只有InnoDB存储引擎支持。
2. 事物基本操作:
start transaction; // 启动事物
begin; // 启动事物
-
事物在创建之后,后续的一连串sql语句都属于该事物。
savepoint xxx; // 创建保存点xxx,用于定向回滚
rollback to xxx; // 回滚到保存点xxx
rollback; // 回滚到最开始
commit; // 提交事物,操作会被持久化保存到数据库,不能再回滚
-
启动事物之后,如果出现客户端崩溃,异常中止等情况,事物会自动会滚到最初。
3. 事物的提交方式:
-
事物的提交方式分为手动提交和自动提交。
-
自动提交只影响未启动事物的情况下,sql语句的提交方式。如果设置为1,就会自动提交。如果设置为0,则需要手动commit进行提交。
-
在使用begin或者start transaction启动事物后,mysql会进入手动提交模式,此时只有用户主动commit才会进行提交。autocommit属性将不再生效。
show variables like 'autocommit'; // 查看事物的提交方式,
set autocommit=1; //开启自动提交
set autocommit=0; // 关闭自动提交
4. 单条sql语句和事物的关系:
-
在开启自动提交后,每一条sql语句会被封装为一个事物,自动提交。
隔离性
-
为了保证事物在执行过程中不被影响,就需要隔离性来保证。
-
隔离级别是事物在执行过程中允许受到的干扰程度的级别。
1. 隔离级别(4种):
-
读未提交、读已提交、可重复读、可串行化。
2. 查看与设置隔离级别:
select @@global.tx_isolation; //查看全局隔离级别,也就是配置文件中默认的隔离级别
select @@session.tx_isolation; // 查看当前会话的隔离级别,可修改,只在本次会话生效的隔离级别
select @@tx_isolation; // 查看当前回话隔离级别,简写
set session/global transaction isolation level {read uncommitted | read committed | repeatable read | serializable}; //设置全局/当前会话的隔离级别;全局隔离级别在修改后,会在下次会话加载配置文件后生效
3. 读未提交(read uncommitted):
-
没有加锁,事物可以读取其他事务未提交的数据。
-
并发性高,但是数据不安全。可能发生脏读、不可重复读、幻读现象。
-
脏读:一个事物可以读到另一个事物的未commit的数据,如果事物发生回滚,那么读取到的数据就变为了脏数据。
4. 读已提交(read committed):
-
只能读到其他事物已经提交的数据,解决了脏读问题。
-
不能保证同一个事物内多次查询的结果是一致的,可能会发生不可重复度。如果一个事物在查询,另一个事物在修改,那么一旦修改的事物发生提交,查询的事物可能在连续的两次查询中查询到不同的结果。
-
并发性较高,但是数据一致性依旧比较弱。
5. 可重复度(repeatable read):
-
mysql默认的隔离等级。
-
在同一个事物内,多次读取的数据相同,结果始终保持一致。解决了脏读、不可重复度问题。
-
仍可能发生幻读(Phantom Read),但 MySQL InnoDB 通过 GAP 锁(间隙锁) 避免了幻读问题。
6. 串行化(serializable):
-
mysql最高的隔离级别。
-
所有事物串行执行,避免了脏读、不可重复度、幻读问题。
-
会对所有读取加锁,大大降低了并发能力。
一致性:
-
一致性是在技术上通过原子性、持久性、隔离性来保证的。
170万+

被折叠的 条评论
为什么被折叠?



