<bean id="transactionManager" class="org.springframework.jdbc.datasource.DataSourceTransactionManager"> <property name="dataSource" ref="dataSource"/> </bean>
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; }
@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(); }
DruidDataSource
ManagedDataSource
DataSource
ACID,最大的问题,解决的是数据的一致性的问题。(能量守恒)
分布式:分布式事务处理瞬时一致性,最终的一致性(异步核对,主流的方式就通过日志来分析)
只要出现了异常,就不会提交。
事务是存在内存中的,断电了,这个事务就不存在了,事务就是回去了。
技术实现方案。
这个类是 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 包给你,然后不同的数据库引入不同的数据库驱动包,数据库启动包是由数据库厂商提供的。
DataSourceTransactionManager.doBegin()
开启事务的方法。
它不管是 commit()
还是 rollback()
都是调用的 Connection 的方法。
org.springframework.transaction.interceptor.TransactionAspectSupport
来源于: https://javaguide.net
微信公众号:不止极客