做的比较好的购物网站,代运营一个月多少钱,什么样的网站结构适合做seo,鱼爪网商城网站如何建设先来看看在JAVA事务的相关技术#xff0c;在JAVA中有两类事务#xff0c;JDBC事务和JTA事务#xff0c;如果是JDBC类型的事务#xff0c;则是由Connection类来控制的。如果创建一个Connection对象时#xff0c;没有显示调用
setTransactionIsolation(int level) 方法在JAVA中有两类事务JDBC事务和JTA事务如果是JDBC类型的事务则是由Connection类来控制的。如果创建一个Connection对象时没有显示调用
setTransactionIsolation(int level) 方法则Connection使用当前数据库默认的事务隔离级别数据库的默认事务隔离级别可以通过相应的SQL语句进行查询例如在Mysql数据库下可使用 select tx_isolation;语句查看当前数据库的事务隔离级别。
JDBC的Connection类针对事务的隔离性定义了五个隔离级别。
Connection.TRANSACTION_NONE
Connection.TRANSACTION_READ_COMMITTED
Connection.TRANSACTION_READ_UNCOMMITTED
Connection.TRANSACTION_REPEATABLE_READ
Connection.TRANSACTION_SERIALIZABLE
在mybatis中有一个事务管理器的配置其中type属性可以配置事务的类型提供了JDBC或MANAGED的配置属性这就说明在mybatis中事务的管理方式有两个事务管理器的实现都是针对JDBC事务的事务管理器非JTA事务分别是 org.apache.ibatis.transaction.jdbc.JdbcTransaction org.apache.ibatis.transaction.managed.ManagedTransaction
这两个类都实现了org.apache.ibatis.transaction.Transaction接口Transaction接口定义了如下方法 Connection getConnection() throws SQLException;void commit() throws SQLException;void rollback() throws SQLException;void close() throws SQLException;
通过这些方法可以看出这个接口实际是对Connection类进行了包装包括了Connection的创建、提交、回滚、关闭动作。并且,其中ManagedTransaction类的commit方法和rollback方法中没有做任何事也就是说这个类是不控制事务的提交和回滚的而交由外部容器去管理事务的提交与回滚外部容器(可以是Spring 容器或EJB容器)通过声明式事务的方式进行管事。
在mybatis中通过一个Enum类org.apache.ibatis.session.TransactionIsolationLevel
来定义了事务的隔离级别 public enum TransactionIsolationLevel {NONE(Connection.TRANSACTION_NONE),READ_COMMITTED(Connection.TRANSACTION_READ_COMMITTED),READ_UNCOMMITTED(Connection.TRANSACTION_READ_UNCOMMITTED),REPEATABLE_READ(Connection.TRANSACTION_REPEATABLE_READ),SERIALIZABLE(Connection.TRANSACTION_SERIALIZABLE);private final int level;private TransactionIsolationLevel(int level) {this.level level;}public int getLevel() {return level;}
} TransactionIsolationLevel类中定义的事务隔离级别其实就是引用了Connection类中的事务隔离级别下面分别对这几种隔离级别进行说明
TRANSACTION_NONE表示不支持事务的常量
TRANSACTION_READ_UNCOMMITTED表示可以发生脏读 (dirty read)、不可重复读和虚读 (phantom read) 的常量
TRANSACTION_READ_COMMITTED不可重复读和虚读可以发生
TRANSACTION_REPEATABLE_READ虚读可以发生
TRANSACTION_SERIALIZABLE指示不可以发生脏读、不可重复读和虚读的常量。
再来理解下什么是脏读、不能重复读、虚读又叫幻读
脏读如果一个事务对数据进行了更新但事务还没有提交另一个事务就可以“看到”该事务没有提交的更新结果。这样造成的问题是如果第一个事务回滚那么第二个事务在此之前所“看到”的数据就是一笔脏数据。
不可重复读指同个事务在整个事务过程中对同一笔数据进行读取每次读取结果都不同。如果事务1在事务2的更新操作之前读取一次数据在事务2的更新操作之后再读取同一笔数据一次两次结果是不同的。所以TRANSACTION_READ_COMMITTED是无法避免不可重复读和虚读。
幻读指同样一个查询在整个事务过程中多次执行后查询所得的结果集是不一样的。幻读针对的是多笔记录。
最后再总结下mybatis只是对JDBC事务提供了事务管理器的封装如果想在mybatis中使用JTA事务需要我们自行实现org.apache.ibatis.transaction.Transaction接口对此Spring框架提供了解决方案可能通过mybatisspringatomikos的整合来完成。或者采用EJB容器也可以提供JTA事务的支持。