目录
一、事务概念(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转到二号
![]()
未提交事务,新开一个窗口查询表数据如下,可以看到表中数据已经改变
四.幻读
一个事物操作数据库表中所有记录,另一个事务给该数据库添加数据,则第一个事物查询不到自己的修改
例:先将隔离级别设置为可重复读
![]()
开启事务
![]()
修改数据
![]()
![]()
新开一个窗口查询表,发现只有光标闪烁,查不到结果
![]()
将之前窗口事务提交
新的窗口显示数据

五.不可重复读
在一个事务中,多次读到同一数据。在事务还没结束时,另外一个事务也访问该同一数据,那么,在第一个事物中的两次两次读数据之间,由于第二个事务的更改,第一个事物两次读到的数据可能是不一样的,这样就会发生一个事务中两次读到的数据不一致,称为不可重复读。
例:先将隔离级别设置为读已提交
![]()
开启事务
![]()
修改数据
![]()
![]()
同一窗口下查询同一表数据不一致

总结
事务的隔离级别越高,数据的安全性越高,但是执行效率会越来越低,在实际应用中应根据不同需求选择合适的隔离级别。
本文详细介绍了数据库事务的概念,包括其四大特性——原子性、一致性、隔离性和持久性,并通过实例解释了这些原则。同时,讨论了事务的基本操作如开启、提交和回滚,以及事务的隔离级别对数据安全性和并发性能的影响。脏读、幻读和不可重复读等并发问题也在文中得到阐述,最后总结了如何根据实际需求选择合适的事务隔离级别以确保数据的准确性和系统稳定性。
612

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



