目录
1、什么是事务?
事务(Transaction):一般是指要做的或所做的事情。在计算机术语中是指访问并可能更新数据库中各种数据项的一个程序执行单元(unit)。在计算机术语中,事务通常就是指数据库事务。
一个数据库事务通常包含对数据库进行读或写的一个操作序列。它的存在包含有以下两个目的:
比如,银行中用户A向用户B转账,其中A的账户余额要减少,B的账户余额要增加,这整个转账操作就是一个事务。当一个事务被提交给了DBMS(数据库管理系统),则DBMS需要确保该事务中的所有操作都成功完成且其结果被永久保存在数据库中,如果事务中有的操作没有成功完成,则事务中的所有操作都需要被回滚,回到事务执行前的状态(要么全执行,要么全都不执行);同时,该事务对数据库或者其他事务的执行无影响,所有的事务都好像在独立的运行。
数据库事务在执行过程中,有可能遇到很多问题,最终导致事务操作失败、数据库系统/操作系统失败,甚至是存储介质失败等情况。那么需要DBMS对事务进行一个维护的操作,将出现问题或失败的事务执行恢复操作。 这便需要DBMS对一个执行失败的事务执行恢复操作,将其数据库状态恢复到一致状态(数据的一致性得到保证的状态)。为了实现将数据库状态恢复到一致状态的功能,DBMS通常需要维护事务日志以追踪事务中所有影响数据库数据的操作。
2、数据库事务的特性
事务具有4个属性:原子性、一致性、隔离性、持久性。这四个属性通常称为ACID特性。
事务的特型概念图:
以银行转账为例,说明如何通过数据库事务保证数据的准确性和完整性。
原子性:
假如,张三向李四转300块钱,张三的账户余额上减少300,但是在执行给李四账户余额加300时发生了系统故障,那么之前的操作就会回滚(即撤销),张三的账户余额恢复到转账操作前的状态。
一致性
在转账之前,张三账户有500块钱,李四账户有500块钱,他们两个人的账户中共有500+500=1000元钱。在转账之后,张三和李四的账户中共有200+800=1000元。也就是说,数据的状态在执行该事务操作之后从一个状态改变到了另外一个状态。同时一致性还能保证账户余额不会变成负数等。
隔离性
在张三向李四转账的整个过程中,只要事务还没有提交(commit),查询张三账户和李四账户的时候,两个账户里面的钱的数量都不会有变化。 如果在张三给李四转账的同时,有另外一个事务执行了王五给赵六转账的操作。这两个事务是独立的,互不影响。
持久性
当转账的事务操作都完成,也就是转账的两个用户余额都已经发生修改,那么对数据做的更改就永久保存在数据库中。
3、如何实现数据库事务
在事务的ACID特性中,C即一致性是事务的根本追求,而对数据一致性的破坏主要来自两个方面
1.事务的并发执行
2.事务故障或系统故障
数据库系统是通过并发控制技术和日志恢复技术来避免这种情况发生的。
并发控制技术保证了事务的隔离性,使数据库的一致性状态不会因为并发执行的操作被破坏。 日志恢复技术保证了事务的原子性,使一致性状态不会因事务或系统故障被破坏。同时使已提交的对数据库的修改不会因系统崩溃而丢失,保证了事务的持久性。
4、MySQL中如何开启、提交 、回滚事务
MYSQL 事务处理主要有两种方法:
1、用 BEGIN/start transaction, ROLLBACK, COMMIT来实现:
BEGIN/start transaction:开启事务
ROLLBACK:事务回滚(撤销操作)
COMMIT:提交事务
2、直接用 SET 来改变 MySQL 的自动提交模式:
SET AUTOCOMMIT=0 禁止自动提交
SET AUTOCOMMIT=1 开启自动提交
5、事务的隔离等级
并发事务处理带来的问题
事务的隔离等级
事务具有隔离性,理论上来说事务之间的执行不应该相互产生影响,其对数据库的影响应该和它们串行执行时一样。
然而完全的隔离性会导致系统并发性能很低,降低对资源的利用率,因而实际上对隔离性的要求会有所放宽,这也会一定程度造成对数据库一致性要求降低
SQL标准为事务定义了不同的隔离级别,从低到高依次是
读未提交(READ UNCOMMITTED)
读已提交(READ COMMITTED)
可重复读(REPEATABLE READ)
串行化(SERIALIZABLE)
事务的隔离级别越低,可能出现的并发异常越多,但是通常而言系统能提供的并发能力越强。
这是本人 最近学习的数据库事务,做了一些简单的总结,如有错误,欢迎指正。