上
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager">
<property name="dataSource" ref="dataSource"/>
</bean>
2
3
transactionManager
就是我们的一个切面
dataSource
其实就是我们 Connection
的一个包装,就是所有的 Connection
相关的东西。
javax.sql.DataSource
其实定义了,提供给我们的 JDBC 框架去扩展的包装类。
public interface DataSource extends CommonDataSource, Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password)
throws SQLException;
}
public interface DataSource extends CommonDataSource, Wrapper {
Connection getConnection() throws SQLException;
Connection getConnection(String username, String password)
throws SQLException;
}
2
3
4
5
6
7
DataSource 的一些配置
@Resource(name = "dataSource")
protected void setDataSource(DataSource dataSource) {
template = new JdbcTemplate(dataSource);
// Statement statement;
// statement.e
// 相当于开启事务,创建Socket连接
// 当我们execute的时候,就和服务端建立连接
dataSource.getConnection().createStatement();
dataSource.getConnection().createStatement()
//事务的回滚
dataSource.getConnection().rollback();
//默认的话是自动提交,所有的事务操作框架,都会把autoCommit改成fasle,否则的话无法手动干预
dataSource.getConnection().setAutoCommit(false);
//只读事务
dataSource.getConnection().setReadOnly(true);
//事务的提交
dataSource.getConnection().commit();
}
@Resource(name = "dataSource")
protected void setDataSource(DataSource dataSource) {
template = new JdbcTemplate(dataSource);
// Statement statement;
// statement.e
// 相当于开启事务,创建Socket连接
// 当我们execute的时候,就和服务端建立连接
dataSource.getConnection().createStatement();
dataSource.getConnection().createStatement()
//事务的回滚
dataSource.getConnection().rollback();
//默认的话是自动提交,所有的事务操作框架,都会把autoCommit改成fasle,否则的话无法手动干预
dataSource.getConnection().setAutoCommit(false);
//只读事务
dataSource.getConnection().setReadOnly(true);
//事务的提交
dataSource.getConnection().commit();
}
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
DruidDataSource
- implements
ManagedDataSource
- extends
DataSource
- extends
5.1 数据库操作,都会通过事务来管理
ACID,最大的问题,解决的是数据的一致性的问题。(能量守恒)
原子性
不可分割,
一致性
隔离性
持久性
分布式:分布式事务处理瞬时一致性,最终的一致性(异步核对,主流的方式就通过日志来分析)
事务的操作流程
只要出现了异常,既不会提交。
断电了来不及回滚?
事务是存在内存中的,断电了,这个事务就不存在了,事务就是回去了。
事务只是一种思想,
技术实现方案。
Connection
这个类是 Java 客户端和数据库服务通信的桥梁,也就是一个包装类
就是一个 TCP 连接,底层就是一个 Socket 连接
适配器模式
java 中没有对这个 connect 及进行实现。
com.mysql.jdbc.MysqlIO
中 this.mysqlConnection = this.socketFactory.connect(this.host, this.port, props);
connectWithTimeoutMethod = Socket.class.getMethod("connect", socketAddressClass, Integer.TYPE);
客户端用反射调用了一个 connect
方法,传了一个 IP,一个端口,进行一个封装
他为什么不去实现?
我作为一个编程语言,定义一个接口,如果你想用我的语言去连接你的数据库,你必须实现我的接口。我给你一个 jar 包给你,然后。
不同的数据库引入不同的数据库驱动包,数据库启动包是由数据库厂商提供的。
DataSource 是 Connection 的一个包装类。
DataSourceTransactionManager
DataSourceTransactionManager.doBegin()
开启事务的方法。
它不管是 commit()
还是 rollback()
都是调用的 Connection 的方法。
下
org.springframework.transaction.interceptor.TransactionAspectSupport