网站建设 中企动力鄂ICP备,windows7怎么做网站服务器,贵州省住房建设部网站,靖江做网站哪家好事务的特性#xff1a;1) 原子性#xff08;atomicity#xff09;#xff1a;事务是数据库的逻辑工作单位#xff0c;而且是必须是原子工作单位#xff0c;对于其数据修改#xff0c;要么全部执行#xff0c;要么全部不执行。2) 一致性#xff08;consistency#xf… 事务的特性1) 原子性atomicity事务是数据库的逻辑工作单位而且是必须是原子工作单位对于其数据修改要么全部执行要么全部不执行。2) 一致性consistency事务在完成时必须是所有的数据都保持一致状态。在相关数据库中所有规则都必须应用于事务的修改以保持所有数据的完整性。3) 隔离性isolation一个事务的执行不能被其他事务所影响。4) 持久性durability一个事务一旦提交事物的操作便永久性的保存在DB中。即使此时再执行回滚操作也不能撤消所做的更改。事务(Transaction):是并发控制的单元是用户定义的一个操作序列。这些操作要么都做要么都不做是一个不可分割的工作单位。通过事务sql server 能将逻辑相关的一组操作绑定在一起以便服务器 保持数据的完整性。事务通常是以begin transaction开始以commit或rollback结束。Commint表示提交即提交事务的所有操作。具体地说就是将事务中所有对数据的更新写回到磁盘上的物理数据库中去事务正常结束。Rollback表示回滚即在事务运行的过程中发生了某种故障事务不能继续进行系统将事务中对数据库的所有已完成的操作全部撤消滚回到事务开始的状态。自动提交事务每条单独的语句都是一个事务。每个语句后都隐含一个commit。 默认显式事务以begin transaction显示开始以commit或rollback结束。隐式事务当连接以隐式事务模式进行操作时sql server数据库引擎实例将在提交或回滚当前事务后自动启动新事务。无须描述事物的开始只需提交或回滚每个事务。但每个事务仍以commit或rollback显式结束。连接将隐性事务模式设置为打开之后当数据库引擎实例首次执行下列任何语句时都会自动启动一个隐式事务alter tableinsertcreateopen deleterevoke dropselect fetch truncate tablegrantupdate在发出commit或rollback语句之前该事务将一直保持有效。在第一个事务被提交或回滚之后下次当连接执行以上任何语句时数据库引擎实例都将自动启动一个新事务。该实例将不断地生成隐性事务链直到隐性事务模式关闭为止。Java JDBC事务机制首先我们来看看现有JDBC操作会给我们打来什么重大问题比如有一个业务当我们修改一个信息后再去查询这个信息看是这是一个简单的业务实现起来也非常容易但当这个业务放在多线程高并发的平台下问题自然就出现了比如当我们执行了一个修改后在执行查询之前有一个线程也执行了修改语句这是我们再执行查询看到的信息就有可能与我们修改的不同为了解决这一问题我们必须引入JDBC事务机制其实代码实现上很简单一下给出一个原理实现例子供大家参考private Connection conn null;
private PreparedStatement ps null; try { conn.setAutoCommit(false); //将自动提交设置为false ps.executeUpdate(修改SQL); //执行修改操作 ps.executeQuery(查询SQL); //执行查询操作 conn.commit(); //当两个操作成功后手动提交
} catch (Exception e) { conn.rollback(); //一旦其中一个操作出错都将回滚使两个操作都不成功 e.printStackTrace();
} 与事务相关的理论
1.事务(Transaction)的四个属性(ACID)
原子性(Atomic) 对数据的修改要么全部执行要么全部不执行。
一致性(Consistent) 在事务执行前后数据状态保持一致性。
隔离性(Isolated) 一个事务的处理不能影响另一个事务的处理。
持续性(Durable) 事务处理结束其效果在数据库中持久化。2.事务并发处理可能引起的问题
脏读(dirty read) 一个事务读取了另一个事务尚未提交的数据
不可重复读(non-repeatable read) 一个事务的操作导致另一个事务前后两次读取到不同的数据
幻读(phantom read) 一个事务的操作导致另一个事务前后两次查询的结果数据量不同。
举例
事务A、B并发执行时
当A事务update后B事务select读取到A尚未提交的数据此时A事务rollback则B读到的数据是无效的脏数据。
当B事务select读取数据后A事务update操作更改B事务select到的数据此时B事务再次读去该数据发现前后两次的数据不一样。
当B事务select读取数据后A事务insert或delete了一条满足A事务的select条件的记录此时B事务再次select发现查询到前次不存在的记录(幻影)或者前次的某个记录不见了。JDBC的事务支持
JDBC对事务的支持体现在三个方面
1.自动提交模式(Auto-commit mode)
Connection提供了一个auto-commit的属性来指定事务何时结束。
a.当auto-commit为true时当每个独立SQL操作的执行完毕事务立即自动提交也就是说每个SQL操作都是一个事务。
一个独立SQL操作什么时候算执行完毕JDBC规范是这样规定的
对数据操作语言(DML如insert,update,delete)和数据定义语言(如create,drop)语句一执行完就视为执行完毕。
对select语句当与它关联的ResultSet对象关闭时视为执行完毕。
对存储过程或其他返回多个结果的语句当与它关联的所有ResultSet对象全部关闭所有update count(update,delete等语句操作影响的行数)和output parameter(存储过程的输出参数)都已经获取之后视为执行完毕。
b. 当auto-commit为false时每个事务都必须显示调用commit方法进行提交或者显示调用rollback方法进行回滚。auto-commit默认为true。
JDBC提供了5种不同的事务隔离级别在Connection中进行了定义。2.事务隔离级别(Transaction Isolation Levels)
JDBC定义了五种事务隔离级别
TRANSACTION_NONE JDBC驱动不支持事务
TRANSACTION_READ_UNCOMMITTED 允许脏读、不可重复读和幻读。
TRANSACTION_READ_COMMITTED 禁止脏读但允许不可重复读和幻读。
TRANSACTION_REPEATABLE_READ 禁止脏读和不可重复读单运行幻读。
TRANSACTION_SERIALIZABLE 禁止脏读、不可重复读和幻读。3.保存点(SavePoint)
JDBC定义了SavePoint接口提供在一个更细粒度的事务控制机制。当设置了一个保存点后可以rollback到该保存点处的状态而不是rollback整个事务。
Connection接口的setSavepoint和releaseSavepoint方法可以设置和释放保存点。JDBC规范虽然定义了事务的以上支持行为但是各个JDBC驱动数据库厂商对事务的支持程度可能各不相同。如果在程序中任意设置可能得不到想要的效果。为此JDBC提供了DatabaseMetaData接口提供了一系列JDBC特性支持情况的获取方法。比如通过DatabaseMetaData.supportsTransactionIsolationLevel方法可以判断对事务隔离级别的支持情况通过DatabaseMetaData.supportsSavepoints方法可以判断对保存点的支持情况。 转载于:https://www.cnblogs.com/xiaolei2017/p/7920681.html