事务概念:指一个单元的工作,要么全做,要么不做。同时,是一个可恢复单元的工作,由一条或者多条Transact-SQL语句组成,可影响到一行或者多行数据。事务打开后,直到事务成功完成提交为止,或者事务失败全部取消或者回滚为止。
显式事务:显式定义事务开始或者结束的事务。
begin transaction \commit transaction \ commit work \rollback transaction \rollback work Transact-SQL
显式事务模式时间只限于事务持续期。结束即结束。
隐式事务:启动事务的语句
语句 | 语句 | 语句 | 语句 |
alter table | drop | insert | select |
create | fetch | open | truncate table |
delete | grant | revoke | update |
隐士事务可以用Transact-SQL set语句来设置。隐式事务会在有大量数据定义语言(DDL)和数据操作 语言(DML)命令执行自动开始,并一直保持到用户明确提交为止,可以用 set implicit_transactions 为连接设置隐式设置模式,当设置为ON时,set implicit_transactions 为隐式,OFF时,则是连接返回到自动提交事务模式。
10.1.2ACID
1.Automicity(原子性):要么全部执行,要么全不执行。
2.Consistency(一致性):事务完成时,所有数据保持一致。
3.Isolation(隔离性):并发事务所做的修改必须与任何其他事务修改所隔离。
4.Durability(持久性) :事务完成后,对于系统影响具有永久性。
10.1.3 Hibernate中使用事务
JDBC本身设计时不具备事务处理功能,Hibernate对jdbc进行轻量级封装。Hibernate将底层JDBCTransaction或JTATransaction进行了封装,再在外面上套上Transaction和Session的外壳,其实是通过底层的JDBC或JTA实现事务处理的功能:
配置事务:在Hibernate.properties进行平配置(默认jdbc事务):
# hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
# hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
1.在Hibernate中使用事务的步骤:
Session session = getSession();
Transaction t = null;
try {
t = session.beginTransaction();
t.commit();
t==null;
} catch (Exception e) {
try {
if(t!=null){
t.rollback();
}
} catch (HibernateException e2) {
// 处理异常
}
}finally{
try {
session.close();
} catch (HibernateException e) {
// 处理异常
}
}
2.在Hibernate中使用JDBC事务
public static void saveObject(Object obj){
Transaction t = null;
try {
Session session = getSession();
t = session.beginTransaction();
//保存事件
session.save(obj);
t.commit();
t==null;
} catch (Exception e) {
try {
if(t!=null){
t.rollback();
}
} catch (HibernateException e2) {
// 处理异常
}
}finally{
try {
session.close();
} catch (HibernateException e) {
// 处理异常
}
}
}
3.在Hibernate中使用JTA事务
JTA(java Transaction API)是事务服务的J2EE解决方案:
配置打开即可使用:
hibernate.transaction.factory_class org.hibernate.transaction.JTATransactionFactory
# hibernate.transaction.factory_class org.hibernate.transaction.JDBCTransactionFactory
去掉‘#’号,或者在hibernate.cfg.xml中如下配置
<session-factory>
<property name="hibernate.transaction.factory_class">
org.hibernate.transaction.JTATransactionFactory
</property>
</session-factory>
10.2 并发控制
4个并发问题:1》丢失更新:两个或多个事务选择同一行数据,基于最初选定值,会发生丢失更新问题。
2》脏读:第二个事务选择其他受正在更新时,发生未确认相关性的问题。
3》非重复读:当第二个事务多次访问同一行而每次读取不同数据时,发生不一致问题。
4》幻想读:当对某行执行插入或删除操作,而该行属于某个事务的读取范围,发生幻想。
5》并发问题解决方案:
SQL Server中共享锁,排它锁,更新锁,意向锁。