数据库事务原理是什么

数据库事务原理是什么,第1张

数据库事务处理是由一个或多个SQL语句序列结合在一起所形成的一个逻辑处理单元。事务处理中的每个语句都是完成整个任务的一部分工作,所有的语句组织在一起能够完成某一特定的任务。

事务处理可以确保除非事务性单元内的所有 *** 作都成功完成,否则不会永久更新面向数据的资源。通过将一组相关 *** 作组合为一个要么全部成功要么全部失败的单元,可以简化错误恢复并使应用程序更加可靠。一个逻辑工作单元要成为事务,就必须满足所谓的ACID属性。

1、什么是数据库事务

数据库事务是构成单一逻辑工作单元的 *** 作集合。数据库事务可以包括一个或多个数据库 *** 作,但是这些 *** 作构成一个逻辑上的整体。

2、数据库事务的四个特性(ACID)

A:原子性,事务中的所有 *** 作作为一个整体不可分割,要么全部 *** 作要么全部不 *** 作。

C:一致性,事务的执行结果必须使数据库从一个一致性状态转为另一个一致性状态。一致性状态:1系统状态满足数据库的完整性约束,2系统的状态反映数据库所描述的现实世界的真实状态。

I:隔离性:并发执行的事务不会相互影响,其对数据库的影响和他们串行执行时一样。

D:持久性:事务一旦提交,对数据库的影响就是持久的。任何事务或系统故障都不会导致数据丢失。

3、什么是数据库连接泄露

数据库连接泄露指的是如果在某次使用或者某段程序中没有正确地关闭Connection、Statement和ResultSet资源,那么每次执行都会留下一些没有关闭的连接,这些连接失去了引用而不能得到重新使用,因此就造成了数据库连接的泄漏。数据库连接的资源是宝贵而且是有限的,如果在某段使用频率很高的代码中出现这种泄漏,那么数据库连接资源将被耗尽,影响系统的正常运转。

4、聚集索引

数据行的物理顺序与列值的顺序相同,如果我们查询id比较靠后的数据,那么这行数据的地址在磁盘中的物理地址也会比较靠后。而且由于物理排列方式与聚集索引的顺序相同,所以也就只能建立一个聚集索引了。

5、主键与外键

关系型数据库中的一条记录中有若干个属性,若其中某一个属性组(注意是组)能唯一标识一条记录,该属性组就可以成为一个主键。

外键用于与另一张表的关联。是能确定另一张表记录的字段,用于保持数据的一致性。比如,A表中的一个字段,是B表的主键,那他就可以是A表的外键。

事务是数据库中的概念,一般来说不会对程序语言进行原子性的捆绑的

我觉得如果你想要保持一致的话,最好不要这样做

因为这样会有一个问题

比如你用SQL删掉了一条记录A

但是执行不成功,而你却在界面上删掉了,这样会让用户误以为已经删掉了,所以看起来你直接删除是提高效率了,但是不可靠,应该重新从数据库中取一下数据,重新更新一下DataGridView

2010-08-05

那我再补充一下,如果你想要你这样说的话,可以采用ADONET中的数据库脱机处理数据,处理完数据再提交更新的方法,即把你的思路反过来,先更新用户的界面数据,然后影响到DataSet中的数据,删除之后,再将这些删除改动提交到数据库,这样即节省了资源占用,提高效率,又可以避免数据库与用户不一致的情况,你觉得呢?

你现在的方式是先改动数据库,再改用户界面,不如像我说的反过来做,试试

2010-08-05

不是这样子,你把数据放在DataSet里,界面数据是从DataSet里对过来的。

你先对DataSet进行 *** 作, *** 作之后,更新数据库,成功则再根据DataSet *** 作后的内容更新界面,不成功,你可以不对界面进行更新,执行异常的相关 *** 作,之所以DataSet可以脱开数据库连接处理数据,就是为了这样子。

既保证了不占用数据库资源,又可以及时的更新用户的界面

事务是作为一个逻辑单元执行的一系列 *** 作,一个逻辑工作单元必须有四个属性,称为 ACID(原子性、一致性、隔离性和持久性)属性,\x0d\ 只有这样才能成为一个事务:\x0d\原子性\x0d\事务必须是原子工作单元;对于其数据修改,要么全都执行,要么全都不执行。\x0d\\x0d\一致性\x0d\事务在完成时,必须使所有的数据都保持一致状态。在相关数据库中,所有规则都必须应用于事务的修改,以保持所有数据的完整性。\x0d\ 事务结束时,所有的内部数据结构(如 B 树索引或双向链表)都必须是正确的。\x0d\\x0d\隔离性\x0d\由并发事务所作的修改必须与任何其它并发事务所作的修改隔离。事务查看数据时数据所处的状态,要么是另一并发事务修改它之前的状态,\x0d\ 要么是另一事务修改它之后的状态,事务不会查看中间状态的数据。这称为可串行性,因为它能够重新装载起始数据,\x0d\ 并且重播一系列事务,以使数据结束时的状态与原始事务执行的状态相同。\x0d\持久性\x0d\事务完成之后,它对于系统的影响是永久性的。该修改即使出现系统故障也将一直保持。

ACID,指数据库事务正确执行的四个基本要素的缩写。包含:原子性(Atomicity)、一致性(Consistency)、隔离性(Isolation)、持久性(Durability)。

在说他们之间的区别之前,先考虑如下几个问题:

1、getCurrentSession()与openSession()的区别?

采用getCurrentSession()创建的session会绑定到当前线程中,而采用openSession()

创建的session则不会

采用getCurrentSession()创建的session在commit或rollback时会自动关闭,而采用openSession()

创建的session必须手动关闭

2、使用getCurrentSession()需要在hibernatecfgxml文件中加入如下配置:

如果使用的是本地事务(jdbc事务)

<property name="hibernatecurrent_session_context_class">thread</property>

如果使用的是全局事务(jta事务)

<property name="hibernatecurrent_session_context_class">jta</property>

以上是hibernate中一些使用,下面来说说jdbc与jta的区别:

JDBC 事务

JDBC 事务是用 Connection 对象控制的。JDBC Connection 接口( javasqlConnection )提供了两种事务模式:自动提交和手工提交。

#在jdbc中,事务 *** 作缺省是自动提交。也就是说,一条对数据库的更新表达式代表一项事务 *** 作, *** 作成功后,系统将自动调用commit()来提交,否则将调用rollback()来回滚。

# 在jdbc中,可以通过调用setAutoCommit(false)来禁止自动提交。之后就可以把多个数据库 *** 作的表达式作为一个事务,在 *** 作完成后调 用commit()来进行整体提交,倘若其中一个表达式 *** 作失败,都不会执行到commit(),并且将产生响应的异常;此时就可以在异常捕获时调用 rollback()进行回滚。这样做可以保持多次更新 *** 作后,相关数据的一致性,示例如下:

try {

conn =

DriverManagergetConnection

("jdbc:oracle:thin:@host:1521:SID","username","userpwd";

connsetAutoCommit(false);//禁止自动提交,设置回滚点

stmt = conncreateStatement();

stmtexecuteUpdate(“alter table …”); //数据库更新 *** 作1

stmtexecuteUpdate(“insert into table …”); //数据库更新 *** 作2

conncommit(); //事务提交

}catch(Exception ex) {

exprintStackTrace();

try {

connrollback(); // *** 作不成功则回滚

}catch(Exception e) {

eprintStackTrace();

}

}

JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。

JTA事务

JTA(Java Transaction API) 为 J2EE 平台提供了分布式事务服务。

要用 JTA 进行事务界定,应用程序要调用 javaxtransactionUserTransaction 接口中的方法。例如:

utxbegin();

//

DataSource ds = obtainXADataSource();

Connection conn = dsgetConnection();

pstmt = connprepareStatement("UPDATE MOVIES ");

pstmtsetString(1, "Spinal Tap");

pstmtexecuteUpdate();

//

utxcommit();

让我们来关注下面的话:

“用 JTA 界定事务,那么就需要有一个实现 javaxsqlXADataSource 、 javaxsqlXAConnection 和 javaxsqlXAResource 接口的 JDBC 驱动程序。一个实现了这些接口的驱动程序将可以参与 JTA 事务。一个 XADataSource 对象就是一个 XAConnection 对象的工厂。 XAConnection s 是参与 JTA 事务的 JDBC 连接。”

要使用JTA事务,必须使用XADataSource来产生数据库连接,产生的连接为一个XA连接。

XA连接(javaxsqlXAConnection)和非XA(javasqlConnection)连接的区别在于:XA可以参与JTA的事务,而且不支持自动提交。

注意:

Oracle, Sybase, DB2, SQL Server等大型数据库才支持XA, 支持分布事务。

My SQL 连本地都支持不好,更别说分布事务了。

JTA方式的实现过程:

用XADataSource产生的XAConnection它扩展了一个getXAResource()方法,事务通过这个方法把它加入到事务容器中进行 管理对于调用者来说,根本看不到事务是如果管理的,你只要声明开始事务,告诉容器我下面的 *** 作要求事务参与了,最后告诉事务说到这儿可以提交或回滚了, 别的都是黑箱 *** 作。

在使用JTA之前,你必须首先实现一个Xid类用来标识事务(在普通情况下这将由事务管理程序来处理)。Xid包含三个元素:formatID、gtrid(全局事务标识符)和bqual(分支修饰词标识符)。

下面的例子说明Xid的实现:

import javaxtransactionxa;

public class MyXid implements Xid

{

protected int formatId;

protected byte gtrid[];

protected byte bqual[];

public MyXid()

{

}

public MyXid(int formatId, byte gtrid[], byte bqual[])

{

thisformatId = formatId;

thisgtrid = gtrid;

thisbqual = bqual;

}

public int getFormatId()

{

return formatId;

}

public byte[] getBranchQualifier()

{

return bqual;

}

public byte[] getGlobalTransactionId()

{

return gtrid;

}

}

其次,你需要创建一个你要使用的数据库的数据源:

public DataSource getDataSource()

throws SQLException

{

SQLServerDataSource xaDS = new

commerantdatadirectjdbcxsqlserverSQLServerDataSource();

xaDSsetDataSourceName("SQLServer");

xaDSsetServerName("server");

xaDSsetPortNumber(1433);

xaDSsetSelectMethod("cursor");

return xaDS;

}

例1 这个例子是用“两步提交协议”来提交一个事务分支:

XADataSource xaDS;

XAConnection xaCon;

XAResource xaRes;

Xid xid;

Connection con;

Statement stmt;

int ret;

xaDS = getDataSource();

xaCon = xaDSgetXAConnection("jdbc_user", "jdbc_password");

xaRes = xaCongetXAResource();

con = xaCongetConnection();

stmt = concreateStatement();

xid = new MyXid(100, new byte[]{0x01}, new byte[]{0x02});

try {

xaResstart(xid, XAResourceTMNOFLAGS);

stmtexecuteUpdate("insert into test_table values (100)");

xaResend(xid, XAResourceTMSUCCESS);

ret = xaResprepare(xid);

if (ret == XAResourceXA_OK) {

xaRescommit(xid, false);

}

}

catch (XAException e) {

eprintStackTrace();

}

finally {

stmtclose();

conclose();

xaConclose();

}

当然,实际过程中,我们不需要写这些代码,这些代码是JTA最终的实现代码。

关于“两步提交协议”,可以参看下面的文章:

>

以上就是关于数据库事务原理是什么全部的内容,包括:数据库事务原理是什么、数据库面试常问问题有哪些、C#中事务处理只针对数据库 *** 作吗等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!

欢迎分享,转载请注明来源:内存溢出

原文地址:https://54852.com/sjk/9365491.html

(0)
打赏 微信扫一扫微信扫一扫 支付宝扫一扫支付宝扫一扫
上一篇 2023-04-27
下一篇2023-04-27

发表评论

登录后才能评论

评论列表(0条)

    保存