事务:
事务就是一段sql语句的批处理,但是这个批处理是不可分割的,要么都执行 要么就回滚(rollback)都不执行
MySQL 事务主要用于处理操作量大,复杂度高的数据。比如说,在人员管理系统中,你删除一个人员,你即需要删除人员的基本资料,也要删除和该人员相关的信息,如信箱,文章等等,这样,这些数据库操作语句就构成一个事务!
1. 在 MySQL 中只有使用了 Innodb 数据库引擎的数据库或表才支持事务。
2. 事务处理可以用来维护数据库的完整性,保证成批的 SQL 语句要么全部执行,要么全部不执行。
3. 事务用来管理 insert,update,delete 语句
一般情况下 事务必须满足4个条件
原子性Atomicity:事务是应用中最小的执行单位,事务是应用中不可再分的最小逻辑执行体。
一致性Consistency:事务执行的结果,必须使数据库从一个一致性状态,变到另一个一致性状态
隔离性Isolation:各个事务的执行互不干扰,任意一个事务的内部操作对其他并发的事务,都是隔离的。也就是说:并发执行的事务之间不能看到对方的中间状态,并发执行的事务之间不能相互影响。
持续性Durability:持续性也成为持久性,指事务一旦提交,对数据所作的任何改变,都要记录到永久存储器中,通常是保存进物理数据库。
事务并发不进行隔离的话就容易产生脏读、幻读、不可重复读
(1) 脏读:事务A读到未提交事务B修改的数据,如果此时事务B中途执行失败回滚,那么此时事务A读取到的就是脏数据。比如事务A对money进行修改,此时事务B读取到事务A的更新结果,但是如果后面事务A回滚,那么事务B读取到的就是脏数据了。
(2) 不可重复读:同一个事务中,对同一份数据读取的结果不一致。事务A在事务B对数据更新前进行读取,然后事务B更新提交,事务A再次读取,这时候两次读取的数据不同。
(3) 幻读:可以做这样一个实验,事务A查询记录数,事务B插入一条记录(主键值为6),提交,然后事务A查询记录数,发现记录数没有改变,但是此时插入一条主键值为6的记录发现冲突了,感觉像出现了幻觉。
他们的区别:
脏读和不可重复读:脏读是事务读取了还未提交事务的更新数据。不可重复读是同一个事务中,几次读取的数据不同。
不可重复读和幻读的区别:都是在同一个事务中,前者是几次读取数据不同,后者是几次读取数据整体不同。
面对以上的问题 对应有各自的隔离级别:
在串行读的情况下 为查询加共享锁,为修改加排他锁,共享锁和共享锁能共存 排他锁和谁都不共存
一般的mysql数据库的默认引擎是innodb(事务,外键) 默认的隔离级别是repeatable
一般使用默认的就可以因为串行化防止一切但是效率太低
事务控制语句:
BEGIN或START TRANSACTION;显式地开启一个事务;
COMMIT;也可以使用COMMIT WORK,不过二者是等价的。
COMMIT会提交事务,并使已对数据库进行的所有修改称为永久性的;
ROLLBACK;有可以使用ROLLBACK WORK,不过二者是等价的。回滚会结束用户的事务,并撤销正在进行的所有未提交的修改;
SAVEPOINT identifier;SAVEPOINT允许在事务中创建一个保存点,一个事务中可以有多个SAVEPOINT;
RELEASE SAVEPOINT identifier;删除一个事务的保存点,当没有指定的保存点时,执行该语句会抛出一个异常;
ROLLBACK TO identifier;把事务回滚到标记点;
SET TRANSACTION;用来设置事务的隔离级别。
InnoDB存储引擎提供事务的隔离级别有READ UNCOMMITTED、READ COMMITTED、REPEATABLE READ和SERIALIZABLE。
MYSQL 事务处理主要有两种方法:
1、用 BEGIN, ROLLBACK, COMMIT来实现
BEGIN 开始一个事务
ROLLBACK 事务回滚
COMMIT 事务确认复制代码
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 关闭自动提交
SET AUTOCOMMIT=1 开启自动提交
注意:如果开启事务之后 sql正常运行,如果后面没有commit,结果不会更新到数据库,我们需要手动在添加commit