数据库事务特性和隔离级别
Posted 残酷游戏
tags:
篇首语:本文由小常识网(cha138.com)小编为大家整理,主要介绍了数据库事务特性和隔离级别相关的知识,希望对你有一定的参考价值。
事务
一组业务操作,要么全部成功,要么全部不成功。
----------------事务的特性--------------
原子性:一个事务是一个整体,不可分割,事务中的操作要么都成功,要么都失败。
一致性:事务必须是使数据库从一个一致性状态变到另一个一致性状态。事务执行前后,数据库的状态是一致的。
例如:A有1000,元,B有1000元,加起来是2000,中间执行转账的操作,转账后两个人的钱加起来还是2000.
隔离性:两个或多个事务并发操作,之间会互相影响。数据库提供了隔离级别来消除这些影响。
持久性:一旦一个事务提交了,对数据库中的数据的影响就是永久的了,如果数据库出现故障或者其他操作都不应该再对其产生影响。
以上是事务的四个特性简称ACDI,重点是事务的隔离性,在对数据库进行操作的时候,开启多个事务同时进行操作,为了能够准确的获取数据,数据库要有隔离性。如果没有隔离性的话,会出现以下几个隔离问题:
----------------隔离问题----------------
脏读:一个事务读到了另一个事务未提交的数据
不可重复读:一个事务读到了另一个事务已经提交的数据(主要针对update)
幻读/虚读:一个事务读到了另一个事务已经提交的数据(主要针对insert)
----------------隔离级别----------------
为了避免这些问题,数据库提供了四种隔离级别(级别由低到高,效率由高到低)
read uncommitted:读未提交,最低级别,存在脏读,不可重复读,幻读三个问题
read committed:读已提交,只能在当前事务中读取到其他事务已经提交的数据。避免了脏读的问题。
repeatable read:可重复读,避免了脏读和不可重复读的问题。
serializable:串行化,避免脏读,不可重复读,幻读的发生。相当于给事务加了锁,效率会比较低。
在mysql数据库中,支持以上四种事务隔离级别,默认的事务隔离级别为repeatable read;
在oracle数据库中,支持read committed、serializable两种事务隔离级别,默认的隔离级别为read committed;
----------------jdbc对数据库事务管理----------------
使用jdbc来对数据库事务进行管理:对事务隔离级别的设置要在开启事务之前
部分代码:
savepoint(保存点):记录操作的当前位置,之后可以回滚到指定的位置
以上是关于数据库事务特性和隔离级别的主要内容,如果未能解决你的问题,请参考以下文章
数据库的特性与隔离级别和spring事务的传播机制和隔离级别