目录
一、事务概念(Transaction)
在mysql中,事务是一种机制,是访问和更新数据库的程序执行单元。
将一组 SQL语句放在同一批次去执行,如果一个SQL语句出错,那该批次的所有SQL语句都会被取消执行。
特点:一个是事务中如果一个数据库操作失败,则整个事务中的所有数据库都操作失败。
限制:Mysql数据库中仅InnoDB和BDB类型的数据库表支持事务。
二、事务ACID原则
ACID,是指在可靠数据库管理系统(DBMS)中,事务(transaction)应该具有的四个特性:
1.原子性(atomic)
数据库中的事务执行是不可再分的,整个语句要么都执行,要么不执行。
事务是一个完整的操作过程,各个元素不可再分,事务中的所有元素必须作为一个整体提交或者回滚,任何元素失败,则整个事务将失败。
例如:转账交易过程可以理解为一个完整的事务,张三给李四转账500,首先要查询张三账户余额是否有500元,第二步就是把张三账余额减去500,同时要将李四的账户余额加500,这个操作才算完成。中间任何一个步骤出现问题,则交易失败。这种情况就体现了事务的原子性。
2.一致性(consist)
在事务开始之前和事务结束之后,数据库的完整性约束没有被破坏。
3.隔离性(isolated)
事务的执行是互不干扰的,一个事物不可能看到其他事物运行时的数据。
在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间,也就是说并发访问数据库时,一个用户的事务不被其他事务所干扰,各并发事务之间数据库是独立的。
4.持久性(durable)
在事务完成之后,该事物对数据库做的更改会持久的保存在数据库中,其他操作或故障不会对其具有任何影响。
事务基本操作:
1.开启事务 start transaction;
2.提交事务 commit;
3.回滚 rollback;
事务提交的两种方式:
1.自动提交
mysql默认自动提交事务
2.手动提交
需要先开启事务,然后设置事务提交方式
set autocommit=0;默认为1.关闭自动提交需要设置为0.(注意如果设置了事务提交方式,在事务完成时需要开启自动提交,即将参数设置为1)
事务的隔离级别:
read uncommitted 读未提交 会产生脏读,不可重复读,幻读
read committed 读已提交 会产生不可重复读,幻读
repeatable read 可重复度 会产生幻读
serializable 串行化 可解决所有问题
mysql数据库默认可重复读,oracle数据库默认读已提交
三.脏读概念
指一个事务读取到其他事物没有提交的数据。
例:先将隔离级别设置为读未提交
然后开启事务
将一号的500转到二号
未提交事务,新开一个窗口查询表数据如下,可以看到表中数据已经改变
四.幻读
一个事物操作数据库表中所有记录,另一个事务给该数据库添加数据,则第一个事物查询不到自己的修改
例:先将隔离级别设置为可重复读
开启事务
修改数据
新开一个窗口查询表,发现只有光标闪烁,查不到结果
将之前窗口事务提交
新的窗口显示数据
五.不可重复读
在一个事务中,多次读到同一数据。在事务还没结束时,另外一个事务也访问该同一数据,那么,在第一个事物中的两次两次读数据之间,由于第二个事务的更改,第一个事物两次读到的数据可能是不一样的,这样就会发生一个事务中两次读到的数据不一致,称为不可重复读。
例:先将隔离级别设置为读已提交
开启事务
修改数据
同一窗口下查询同一表数据不一致
总结
事务的隔离级别越高,数据的安全性越高,但是执行效率会越来越低,在实际应用中应根据不同需求选择合适的隔离级别。