spring 1.1.3 JDBC编程式事务管理探析(一)
一、我们一般通过下面的代码来应用事务管理:
-
?
public
?
void
?addEmployee(Employee?employee)?
throws
?SQLException?{??
-
??transactionTemplate.execute(new
?TransactionCallback()?{??
-
????public
?Object?doInTransaction(TransactionStatus?ts)?{??
-
??????try
?{??
-
????????jdbcTemplate.update("INSERT?INTO?Employee?(username,age)?VALUES(?,??)"
,?
new
?Object[]{
"lizi"
,
new
?Integer(
22
)});??
-
????????jdbcTemplate.update("INSERT?INTO?Employee?(username,age)?VALUES(?,??)"
,?
new
?Object[]{
"lijun"
,
new
?Integer(
55
)});??
-
????????System.out.println("更新成功"
);??
-
??
-
??????}?catch
?(Exception?ex)?{??
-
????????System.out.println("更新失败"
);??
-
????????ts.setRollbackOnly();??
-
??????}??
-
??????return
?
null
;??
-
????}??
-
??});??
-
}??
事务的代码封装在了TransactionTemplate当中。接下来通过几个序列图来剖析事务的应用。
二、TransactionTemplate.execute
二、事务开始getTransaction
getTransaction完成的任务有:
- 从DataSource获取新的连接
- 将连接的autoCommit属性设置为false。
- TransactionSynchronizationManager将(dataSource,连接)名值对作为线程变量保存起来。
- Transaction对象也保存了连接的句柄
三、提交事务commit
提交事务:
- 调用了连接的commit方法
- 将(DataSource,连接)名值对从本地线程变量中删除
- 归还(关闭)连接
四、总结
spring jdbc的事务管理的做法与我们通常用的一致.帮我们完成了下列步骤中的1,2,4,5步。
- 先创建连接
- 再设置连接的自动提交属性为false
- 执行SQL语句
- 提交事务
- 关闭连接。