`

数据库事务 (一)

阅读更多
数据库事务的概念

● 事务是指一组相互依赖的操作行为,如银行交易,股票交易或网上购物。事务的成功取决于这些相互依赖的操作行为是否都能执行成功,只要有一个操作行为失败,就意味着整个事务失败。

例如,Tom到银行办理转账事务,把100元转到Jack的账号上,这个事务包括以下操作行为:
- (1)从Tom的账号上减去100元。
- (2)往Jack的账号上增加100元。
以上两个操作必须作为一个不可分割的工作单元。 假如仅仅第一步操作执行成功,使得Tom的账户上扣除了100元,
但是第二部操作执行失败,Jacj账户上没有增加100元,那么整个事务失败。

数据库事务是对现实生活中事务的模拟,它由一组在业务逻辑上相互依赖的SQL语句组成。



事物(Transaction)



声明事务的边界:
- 事务的开始边界。
- 事务的正常结束边界(commit):提交事务,永久保存被事务更新后的数据库状态。
- 事务的异常结束边界(rollback):撤销事务,使数据库退回到执行事务钱的初始状态。


数据库事务的4个特性(ACID):
1) 原子性(Atom)   
  -事务中的最基本的操作单位,它所做的数据更改操作要么全部执行,要么全部不执行。

2) 一致性(Consistence)
- 一个事务执行之前和执行之后,数据库必须处于一致状态。比如满足所有完整性约束。

3) 隔离性(Isolation)
- 事务是相互隔离的,既一个事务内部的操作和正在操作的数据必须封锁起来。
比如两个用户都在操作一个数据,要保证二者不互相影响。

4) 持久性(Duration)
- 事务提交后,对数据库数据的改变时永久性的。



实例:
在JDK的sql包中,接口Conntection的setAutoCommit()方法就是针对数据库连接的事务提交。

void setAutoCommit(boolean autoCommit)
                   throws SQLException

Sets this connection's auto-commit mode to the given state. If a connection is in auto-commit mode, then all its SQL statements will be executed and committed as individual transactions. Otherwise, its SQL statements are grouped into transactions that are terminated by a call to either the method commit or the method rollback. By default, new connections are in auto-commit mode.
The commit occurs when the statement completes. The time when the statement completes depends on the type of SQL Statement:

For DML statements, such as Insert, Update or Delete, and DDL statements, the statement is complete as soon as it has finished executing.
For Select statements, the statement is complete when the associated result set is closed.
For CallableStatement objects or for statements that return multiple results, the statement is complete when all of the associated result sets have been closed, and all update counts and output parameters have been retrieved.
NOTE: If this method is called during a transaction and the auto-commit mode is changed, the transaction is committed. If setAutoCommit is called and the auto-commit mode is not changed, the call is a no-op.

Parameters:
autoCommit - true to enable auto-commit mode; false to disable it



代码实例如下:

	public static void main(String[] args)throws  ClassNotFoundException, SQLException
	{	
		Class.forName("oracle.jdbc.driver.OracleDriver");
		Connection con=DriverManager.getConnection("jdbc:oracle:thin:@localhost:1521:ORCL","123","123");
		
		
		
	
		
		try
		{//	con.setAutoCommit(false);
		
			Statement stmt=con.createStatement();
			stmt.execute("insert into test values (2)");
			stmt.execute("insert into test values('1sd')");
		//	con.commit();
		}
		catch (SQLException e)
		{
			try{
				System.out.println("rollback begin");
				//con.rollback();
				System.out.println("rollback finished");
			}catch(Exception e1){
				e1.printStackTrace();
			}
			e.printStackTrace();
		}
 
		
		
		
	}

第一遍执行先不设置任何事务管理,让程序直接运行。
这样当执行了insert into test values(2),  这里的插入操作就会被成功执行。
而到了insert into test values('lsd'),就会抛出异常。
此时查看数据库,发现test表中已经有了第一个insert语句的数值。
假如这两条是相关的,比如上面所说的银行转账, 那就必须都被执行才可以。。

当setAutoCommit被设置了false,并使用commit和rollback时,这个问题就得到了解决。
上面的程序执行结果就变成了:

rollback begin
rollback finished
java.sql.SQLException: ORA-01722: 无效数字

这时查看数据库,就会发现数据库里并没有第一个insert语句所插入的数值。



===============================================================
多个事务并发运行时的并发问题

-第一类丢失更新: 撤销一个事务时,把其它事务已提交的更新数据覆盖。
-脏读: 一个事务读到另一事务未提交的更新数据。
-虚读: 一个事务读到另一事务已提交的新插入的数据。
-不可重复读: 一个事务读到另一事务已提交的更新数据。
-第二类丢失更新: 这是不可重复读中的特例,一个事务覆盖另一事务已提交的更新数据。

取款事务和支票转账事务
取款事务包括以下步骤:
1. 某银行客户在银行前台请求取款100元,出纳员先查询账户信息,得知存款余额为1000元。
2. 出纳员判断出存款额超过了取款额,就支付给客户100元,并将账户上的存款余额改为900.
支票转账事务包含以下步骤:
1. 某出纳员处理一转账支票,该支票向一账户汇入100元。 出纳员先查询账号信息,得知存款余额为900元。
2. 出纳员将存款余额改为1000元。


脏读例子:








  • 大小: 72.2 KB
  • 大小: 188.6 KB
  • 大小: 128.8 KB
分享到:
评论

相关推荐

    C#数据库事务原理及实践

    数据库事务确保了在多步骤操作中,如果其中一个步骤失败,整个事务可以被回滚,从而避免了数据的不一致状态。 在C#中,与数据库进行交互通常使用ADO.NET框架,它可以方便地处理数据库事务。首先,我们需要连接到...

    数据库事务处理ppt

    数据库事务处理是数据库管理系统中的核心概念,用于确保数据的一致性和完整性。事务是数据库操作的基本单元,它包含一组逻辑操作,这些操作要么全部执行,要么全部不执行,以确保数据的原子性。事务处理主要关注两个...

    redis事务与关系型数据库事务比较

    【Redis 事务与关系型数据库事务的比较】 Redis 和关系型数据库(如 MySQL)在事务处理上有显著的差异。在Redis中,事务提供了一种批量执行命令的方式,以确保原子性,但其机制与传统的ACID(原子性、一致性、隔离...

    sql数据库事务机制详解

    例如,下面是一个使用C#操纵数据库事务的例子: ```csharp using System; using System.Data.SqlClient; public class DatabaseOperations { public void PerformTransaction() { string connectionString = ...

    数据库事务,包括事务的概念、特性

    数据库事务:对数据库事务的讲解,事务的概念 理解事务的特性、分类

    java代码-使用java解决数据库事务处理的源代码

    java代码-使用java解决数据库事务处理的源代码 ——学习参考资料:仅用于个人学习使用!

    数据库事务应用

    ### 数据库事务应用详解 #### 事务处理的重要性与ACID特性 事务处理是现代数据库管理系统(DBMS)中不可或缺的一部分,尤其对于那些涉及复杂业务逻辑、需要确保数据一致性和完整性的应用来说更是如此。事务处理的...

    数据库 事务

    数据库事务是数据库操作的核心概念,它是数据库管理系统执行过程中的一个逻辑工作单位,包含了对数据库的一系列操作。在数据库系统中,事务确保数据的一致性和完整性,使得即使在系统出现故障或者并发操作的情况下,...

    分布式数据库事务处理(COM+实现)

    分布式数据库事务处理是数据库系统中的一个重要概念,尤其是在大型企业级应用和互联网服务中,它能够保证数据的一致性和完整性,即使在多台计算机之间进行数据操作。COM+(Component Object Model Plus)是微软提出...

    数据库事务处理课件

    共计132页的ppt,详细讲述数据库事务处理技术

    数据库之事务调优

    数据库之事务调优是数据库管理中的一个重要环节,它关乎到系统的性能、稳定性和并发处理能力。事务是数据库操作的基本单位,确保数据的一致性、...通过这些方法,我们可以构建出一个高效、稳定的数据库事务处理系统。

    数据库事务管理数据库事务管理.ppt

    数据库事务管理数据库事务管理

    db2数据库事务日志

    ### DB2数据库事务日志详解及处理方法 #### 一、引言 在数据库管理领域,尤其是对于IBM DB2这样的大型关系型数据库管理系统而言,事务日志管理是至关重要的环节之一。事务日志用于记录数据库中的所有事务操作,确保...

    数据库基础数据库事务处理.pptx

    "数据库基础数据库事务处理" 数据库事务处理是数据库系统的基本概念,允许用户对数据进行更改,然后决定是保存还是放弃所做的更改。事务处理是一个不可分割的工作单位,多个步骤绑定在一起形成一个逻辑操作,包含...

    数据库事务管理及锁.xmind

    数据库事务管理及锁机制原理剖析:包括事务特性 ACID、数据隔离级别、事务实现的原理、锁机制,及过程中可能遇到的查询效率及死锁问题等

    一个简单的方法来实现数据库的事务

    事务(Transaction)是数据库操作中的一个重要概念,它是一组操作的集合,这些操作要么全部成功,要么全部失败。事务具有四个基本属性:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性...

    CSharp数据库事务原理及实践.rar_C#事务逻辑_c# ef 事务开发_c# 使用事务_c# 数据库事务_c#什么是事务

    本文将深入探讨C#语言中与数据库事务相关的原理及实践,包括事务的定义、特性、类型,以及如何在C#中利用Entity Framework(EF)进行事务开发和管理。 首先,我们需要理解什么是事务。在数据库系统中,事务是一组...

Global site tag (gtag.js) - Google Analytics