事务

1. 概念

在mysql中 事务指的是一组sql语句的集合
这组语句要么全都执行成功 , 要么全都执行失败

2. 用途

比如说转账,转账可以分为两部分来完成,转入和转出,只有这两个部分都完成才认为转账成功。在数据库中,这个过程是使用两条语句来完成的,如果其中任意一条语句出现异常没有执行,则会导致两个账户的金额不同步,造成错误。

3. 使用方法

START TRANSACTION; 开启事物
放在事务里面的代码块
commit;  或者 rollback;

commit 是提交事物 , 完成修改
rollback 是回滚 回到开启事物前的状态

需要注意的是,ROLLBACK语句只能针对未提交的事务执行回滚操作,已提交的事务是不能回滚的

4. 注意

在mysql客户端 , 默认自动提交 , 一条sql语句就是一个单独的事物

pymysql 默认是不自动提交 需要手动commit 意思是默认就开启了事务

5. 事务的特性

  1. 原子性

原子性是指事务必须被认为是一个不可分割的单元,只有事务中所有的数据库操作都执行成功,才算整个事务执行成功,事务中如果有任何一个SQL语句执行失败,已经执行成功的SQL语句也必须撤销,数据库的状态退回到执行事务前的状态。

这在一些关键系统中尤其重要,现实世界的应用程序(如金融系统)执行数据输入或更新,必须保证不出现数据丢失或者数据错误,以保证数据安全性。

  1. 隔离性

事务之间要相互隔离 为了维护数据完整性 : 你有一张银行卡 第一次查看了余额 发现有1000 开开心心买东西去了
买完东西 回来付钱 再一查 发现余额不足 , 原来 你在第一次查询后 你的媳妇把钱转走了
上面这个问题称为不可重复读
如何避免 我在查的时候你不能修改 查询和 修改不能同时进行

3.一致性

当事务执行后 所有的数据都是完整的(外键约束 非空约束)

4.持久性

一旦事务提交 数据就永久保存

6. 四种隔离级别

读未提交 READ UNCOMMITTED
读已提交 READ COMMITTED
可重复读 REPEATABLE READ 默认
可串行化 SERIALIZABLE

可重复读的幻读问题
InnoDB和Falcon存储引擎通过多版本并发控制(MVCC,Multiversion Concurrency Control)机制解决了该问题。

事务_第1张图片
隔离级别

1、脏读:事务A读取了事务B更新的数据,然后B回滚操作,那么A读取到的数据是脏数据

2、不可重复读:事务 A 多次读取同一数据,事务 B 在事务A多次读取的过程中,对数据作了更新并提交,导致事务A多次读取同一数据时,结果 不一致。

3、幻读:系统管理员A将数据库中所有学生的成绩从具体分数改为ABCDE等级,但是系统管理员B就在这个时候插入了一条具体分数的记录,当系统管理员A改结束后发现还有一条记录没有改过来,就好像发生了幻觉一样,这就叫幻读。

设置&查看 隔离级别

1.查看当前会话隔离级别
select @@tx_isolation;

2.查看系统当前隔离级别
select @@global.tx_isolation;

3.设置当前会话隔离级别
set session transaction isolatin level repeatable read;

4.设置系统当前隔离级别
set global transaction isolation level repeatable read;

你可能感兴趣的:(事务)