如需转载分享,请标明出处,且不用于盈利为目的,谢谢合作!
事务的四大特性、事务四大隔离级别、事务传播行为
前言
本文介绍事务的四大特性,事务的四大隔离级别,事务的传播行为,以及注解开发的注意事项。
提示:以下是本篇文章正文内容,下面案例可供参考
一、事务的四大特性是什么?
事务的四大特性:原子性、一致性、隔离性、持久性
原子性(Atomicity):事务是数据库的逻辑工作单位,数据库的修改要么全部执行,要么全部不执行。
一致性(Consistemcy):事务前后,数据库的状态都满足所有的完整性约束(数据完整性约束指的是为了防止不符合规范的数据进入数据库,在用户对数据进行插入、修改、删除等操作时,DBMS自动按照一定的约束条件对数据进行监测,使不符合规范的数据不能进入数据库,以确保数据库中存储的数据正确、有效、相容)。
隔离性(Isolation):多个并发事务之间相互隔离,互不影响,通过设置数据库的隔离级别,可以达到不同的隔离效果。
持久性(Durability):在事务完成之后,该事务所对数据库的修改是持久的保存在数据库中,对数据库中的数据改变是永久性的。
二、事务的四大隔离级别是什么?
事务的四大隔离级别由低到高依次为:读取未提交、读取已提交、可重复读、序列化(串行化)
读取未提交(read_uncommitted):读取未提交数据(会出现脏读,不可重复读),一个事务已经开始了写数据没有提交,允许其他事务读此数据。相当于一个事务读取了另一个事务未提交的数据。避免了更新丢失。
读取已提交(read_committed):读取已提交数据(会出现不可重复读和幻读),允许其他事务读取该数据,但是未提交的写事务将禁止其他事务访问,避免了脏读。相当于一个事务读取了另一个事务已提交的数据。
可重复读(repetable_read):可重复读(会出现幻读),可重复读是指在同一个事务内多次读同一数据,在这个事务还没有结束时,另一个事务也访问该同一数据。那么,在第一个事务中的两次读取数据之间,即使第二个事务对数据进行修改操作,第一个事务两次读取的数据都是一样的。读取数据的事务将会禁止写事务(但运行读事务),写事务禁止了其他事务访问。这样避免了不可重复读和脏读,但可能会出现幻象读。
串行化(serializable):序列化、串行化,提供严格的事务隔离。他要求事务序列化执行,事务只能一个接着一个地执行,但不能并发执行。在该级别下,事务是顺序执行的,所有避免了脏读,不可重复读,幻象读。
更新丢失:两个事务都同时更新一行数据,但是第二个事务却中途失败退出,导致对数据的两个修改都失效了。这是因为系统没有执行任何的锁操作,因此并发事务并没有被隔离开来。
脏读:一个事务读取另外一个事务还没有提交的数据叫脏读。
例如:事务T1修改了一行数据,但是还没有提交,这时候事务T2读取了被事务T1修改后的数据,之后事务T1因为某种原因Rollback了,那么事务T2读取的数据就是脏的。
不可重复读:不可重复读是指在同一个事务内,两个相同的查询返回了不同的结果。
例如:事务T1读取某一数据,事务T2读取并修改了该数据,T1为了对读取值进行检验而再次读取该数据,便得到了不同的结果。
幻读:事务在操作过程中进行两次查询,第二次查询的结果包含了第一次查询中未出现的数据或者缺少了第一次查询中出现的数据
例如:在第一个事务中的两次读取数据之间,第二个事务对数据进行修改操作,第一个事务两次读取的数据都是一样的,就好像发生了幻觉一样。这就叫幻读。
MYSQL默认隔离级别:REPEATABLE_READ级别
SQLSERVER默认隔离级别:READ_COMMITTED
Oracle 默认隔离级别:READ_COMMITTED