• 数据库事务操作 小强斋


    事务(Transaction)是并发控制的基本单位。

        所谓事务,它是一个操作序列,这些操作要么都执行,要么都不执行,它是一个不可分割的工作单位。例如,银行转帐工作:从一个帐号扣款并使另一个帐号增款,这两个操作要么都执行,要么都不执行。

      数据库事务必须具备ACID特性,ACID是Atomic(原子性)、Consistency(一致性)、Isolation(隔离性)和Durability(持久性)的英文缩写。

      原子性:指整个数据库事务是不可分割的工作单位。只有使据库中所有的操作执行成功,才算整个事务成功;事务中任何一个SQL语句执行失败,那么已经执行成功的SQL语句也必须撤销,数据库状态应该退回到执行事务前的状态。

      一致性:指数据库事务不能破坏关系数据的完整性以及业务逻辑上的一致性。例如对银行转帐事务,不管事务成功还是失败,应该保证事务结束后ACCOUNTS表中Tom和Jack的存款总额为2000元。

      隔离性:指的是在并发环境中,当不同的事务同时操纵相同的数据时,每个事务都有各自的完整数据空间。由并发事务所做的修改必须与任何其他并发事务所做的修改隔离。事务查看数据更新时,数据所处的状态要么是另一事务修改它之前的状态,要么是另一事务修改它之后的状态,事务不会查看到中间状态的数据

      持久性:指的是只要事务成功结束,它对数据库所做的更新就必须永久保存下来。即使发生系统崩溃,重新启动数据库系统后,数据库还能恢复到事务成功结束时的状态。

      事务的(ACID)特性是由关系数据库管理系统(RDBMS,数据库系统)来实现的。数据库管理系统采用日志来保证事务的原子性、一致性和持久性。日志记录了事务对数据库所做的更新,如果某个事务在执行过程中发生错误,就可以根据日志,撤销事务对数据库已做的更新,使数据库退回到执行事务前的初始状态。

      数据库管理系统采用锁机制来实现事务的隔离性。当多个事务同时更新数据库中相同的数据时,只允许持有锁的事务能更新该数据,其他事务必须等待,直到前一个事务释放了锁,其他事务才有机会更新该数据。

    数据库事务操作,取消自动提交,conn.setAutoCommit(false) ;执行sql语句,如果有异常的话,回滚conn.rollback() ;

    <%@ page contentType="text/html;charset=gb2312"%>
    <%@ page import="java.sql.*"%>
    <%--
    	此代码主要进行查询操作
    --%>
    <%!
    	// 定义数据库驱动程序
    	String DBDRIVER = "sun.jdbc.odbc.JdbcOdbcDriver" ;
    	// 定义数据库连接地址
    	String DBURL = "jdbc:odbc:mldn" ;
    
    	// 定义数据库连接对象,属于java.sql包中的接口
    	Connection conn = null ;
    
    	// 定义Statement对象,用于操作数据库
    	Statement stmt = null ;
    
    	// 定义一字符串变量,用于保存SQL语句
    	String sql = null ;
    
    	// 查询返回的结果集对象
    	ResultSet rs = null ;
    %>
    <%
    	// 1、加载驱动程序
    	try
    	{
    		Class.forName(DBDRIVER) ;
    	}
    	catch(Exception e)
    	{
    		// 此处使用out.print是处于演示目的,在实际开发中所有的错误消息,绝对不能够通过out.print打印,否则会存在安全问题
    		out.println("数据库驱动程序加载失败!!!") ;
    	}
    
    	// 2、连接数据库
    	try
    	{
    		conn = DriverManager.getConnection(DBURL) ;
    	}
    	catch(Exception e)
    	{
    		out.println("数据库连接失败!!!") ;
    	}
    
    	// 3、操作数据库
    	// 通过Connection对象实例化Statement对象
    	try
    	{
    		// 声明结果集可上下移动
    		stmt = conn.createStatement() ;
    		// 取消自动提交
    		conn.setAutoCommit(false) ;
    		// 编写查询的SQL语句
    		// sql = "SELECT id,name,password,age FROM person" ;
    		stmt.addBatch("INSERT INTO person (name,password,age) VALUES ('LXH_A','zzzzzz',28)") ;
    		stmt.addBatch("INSERT INTO person (name,password,age) VALUES ('LXH_B','zzzzzz',28)") ;
    		stmt.addBatch("INSERT INTO person (name,password,age) VALUES ('LXH_C','zzzzzz',28)") ;
    		stmt.addBatch("INSERT INTO person (name,password,age) VALUES ('LXH_D','zzzzzz',28)") ;
    		stmt.addBatch("INSERT INTO person (name,password,age) VALUES ('LXH_E','zzzzzz',28)") ;
    		stmt.addBatch("INSERT INTO person (name,password,age) VALUES ('LXH_F','zzzzzz',28)") ;
    		stmt.addBatch("INSERT INTO person (name,password,age) VALUES ('LXH_G','zzzzzz',28)") ;
    		stmt.addBatch("INSERT INTO person (name,password,age) VALUES ('LXH_H','zzzzzz',28)") ;
    		// 执行批处理语句
    		stmt.executeBatch() ;
    		// 如果没有异常,则执行此段代码
    		// 提交事务,真正向数据库中插入数据
    		conn.commit() ;
    	}
    	catch(Exception e)
    	{
    		// 将数据库回滚
    		try
    		{
    			conn.rollback() ;
    		}
    		catch(Exception e1)
    		{}
    		out.println("操作数据库失败!!!") ;
    	}
    	// 4、关闭数据库
    	try
    	{
    		// 关闭结果集
    		// rs.close() ;
    		// 关闭操作
    		stmt.close() ;
    		// 关闭连接
    		conn.close() ;
    	}
    	catch(Exception e)
    	{
    		out.println("数据库关闭失败!!!") ;
    	}
    %>



     

  • 相关阅读:
    PythonのTkinter基本原理
    使用 Word (VBA) 分割长图到多页
    如何使用 Shebang Line (Python 虚拟环境)
    将常用的 VBScript 脚本放到任务栏 (Pin VBScript to Taskbar)
    关于 VBScript 中的 CreateObject
    Windows Scripting Host (WSH) 是什么?
    Component Object Model (COM) 是什么?
    IOS 打开中文 html 文件,显示乱码的问题
    科技发展时间线(Technology Timeline)
    列置换密码
  • 原文地址:https://www.cnblogs.com/xiaoqiangzhaitai/p/5429618.html
Copyright © 2020-2023  润新知