
课程咨询: 400-996-5531 / 投诉建议: 400-111-8989
认真做教育 专心促就业
数据库事务的学习和应用是每一位软件编程开发程序员在学习MySQL数据库开发的时候都需要熟练掌握的一个编程知识点,而本文我们就通过案例分析来简单了解一下,数据库事务入门知识分享。
原子性:一个事务必须被视为不可分割的小工作单元,整个事务的所有操作要么全部提交完成,要么全部失败回滚,对于一个事务来说不可能执行其中的一部分。
原子性就是指这四步完整执行不可再分。
一致性:数据库从一个一致性的状态转换为另一个一致性的状态。就上面那个例子:如果在三步执行完系统崩溃,账户中的金额还是1000元,因为一个事务没有执行完,在终提交前是不会保存到数据库中的。
隔离性:通常来讲一个事务在终提交前,对其他事务是不可见的。就之前例子来说,三步执行完,在没提交之前B账户来看到的金额仍然是1000元。是不可见的。
持久性:事务一旦提交其所做的修改就会永远的被保存到数据库中,即使系统崩溃也不会丢失。
一个实现了事务的数据库相比于没有实现事务的数据库它需要更强的CPU处理能力、更大的内存、更多的磁盘空间。对于有些不需要事务的查询类应用选择一个非事务型的存储引擎可以获得更高的性能。
1.隔离级别
一共有四种隔离级别先简单做个介绍:
A.READUNCOMMIT(读未提交)
在这个隔离级别中,事务的修改,即使没有提交,对其他的事务也是可见的。事务可以读到未提交的数据,这些数据也被称为脏读。
B.READCOMMIT(读已提交)(不可重复读)
大多数数据库系统的默认隔离级别都是读已提交,但是MySQL不是,MySQL的默认隔离级别是可重复读。简单说就是一个事务开始时只能“看见”已经提交的事务所做的修改,换句话说,一个事务从开始到提交这个过程中所做的所有修改对其他事务是不可见的。这个级别对于两次执行相同情况的查询,可能会得到不同的结果。
C.REPEATABLEREAD(可重复读)
该级别保证了在同一个事务中多次读取同样的记录结果是一致的,但是它无法解决幻读的问题。
D.SERIALIZABLE(可串行化)
是高的隔离级别。它通过强制事务串行化执行,避免了所有问题,他会在读取的每一行记录上面都加锁,所以可能导致大量的超时与锁等待的问题,并发低。
讲几个概念:
1.脏读:A用户把钱取出没有提交,B用户读取到修改了的金额为800,过一会A因为异常事务回滚,B再次读取发现值变为1000,两次不一样,一次读到的是脏数据。
2.不可以重复读:B读到数据为1000后,A修改数据为800并且提交,B再次读取为800,两次数据不一致。
3.幻读:与不可重复读类似:B读到一个表里有10条记录,A插了一条并提交,B再次读为11条,感觉发生幻觉一样。
不同隔离级别引发的问题:
2.死锁
多个事务在同一资源上相互占有,并且请求锁定对方占用的资源,从而导致恶性循环的现象。
数据库系统实现了各种死锁检测和死锁超时机制。InnoDB目前处理死锁的方法是:将持有少行排它锁的事务进行回滚。
3.事务日志
事务日志可以提高事务的效率,使用事务日志时:存储引擎在修改表数据时只需要修改其内存拷贝,再把该修改行为记录到持久在硬盘上的事务日志中,不用每次将修改的数据本身持久到硬盘。事务日志采用追加的方式,写日志的操作是磁盘上的一小块区域内的顺序I/O.事务日志持久后,内存中被修改的数据将在后台慢慢刷回到磁盘。所以一共需要两次磁盘I/O:一次写日志磁盘I/O,一次刷回磁盘I/O.
4.MySQL中的事务
1.自动提交:MySQL默认采用自动提交的方式。比如每个查询就是一个事务执行完自动提交。
2.非事务型存储引擎如:MyISAM无回滚功能。
【免责声明】本文系本网编辑部分转载,转载目的在于传递更多信息,并不代表本网赞同其观点和对其真实性负责。如涉及作品内容、版权和其它问题,请在30日内与管理员联系,我们会予以更改或删除相关文章,以保证您的权益!请读者仅作参考。更多内容请加抖音太原达内IT培训学习了解。