一、什么是Java事物
我们通常说的事物是指数据库事物,那么Java事物又是什么,它与数据库事物之间是什么关系?
在Java的开发系统中,如果需要操作数据库,则需要JDBC来连接。新增,修改,删除数据也是通过java代码来操作,所以数据库事物的控制就转移到Java代码中,这时候的数据库事物习惯上就叫做Java事物。
Java的事物类型有两种:JDBC事物和JTA(Java Transaction API)事物
1.JDBC事物
JDBC 事务(本地事物)是用 Connection 对象控制的,下图是一个简单的本地事物处理流程:
JDBC Connection 接口( java.sql.Connection )提供了两种事务模式:自动提交和手工提交。
java.sql.Connection 提供了以下控制事务的方法:
public voidsetAutoCommit(boolean)
public booleangetAutoCommit()
public void commit()
public void rollback()
使用 JDBC 事务界定时,您可以将多个 SQL 语句结合到一个事务中。JDBC 事务的一个缺点是事务的范围局限于一个数据库连接。一个 JDBC 事务不能跨越多个数据库。
2. JTA事物(Java Transaction API)
JTA(分布式事物)是一种高层的,与实现无关的,与协议无关的API。应用程序可以通过JTA的接口使用事物。与JDBC事物相比,JTA事物允许访问或者更新多个资源(通常是数据库),极大的提高了数据的访问能力。下图是一个简单的分布式事物的处理流程:
1.UserTransaction—javax.transaction.UserTransaction接口提供能够编程地控制事务处理范围的应用程序。 javax.transaction.UserTransaction方法开启一个全局事务并且使用调用线程与事务处理关联。
2.Transaction Manager—javax.transaction.TransactionManager接口允许应用程序服务器来控制代表正在管理的应用程序的事务范围。
3.XAResource—javax.transaction.xa.XAResource接口是一个基于X/Open CAE Specification的行业标准XA接口的Java映射。
注意:
如果一个程序已经用了分布式事物的XA连接就不要再用JDBC连接,即不要使用java.sql.Connection. commit()和java.sql.Connection. rollback()。
容器事物一般是指J2EE容器自己的提供的事物管理机制,这里笔者理解容器事物应该是指框架事物,例如EJB,hibernate等框架提供的事物服务。其原理是对JDBC和JTA的再次封装,在使用上提供了更加方便的API或者是更强大的声明式的事物管理。
在多线程访问数据源的情况下,事物之间使用锁隔开的。JDBC的API提供了5中不同级别的隔离级别,具体如下:
TRANSACTION_NONE:不支持事务。
TRANSACTION_READ_UNCOMMITTED: 在提交前一个事务可以看到另一个事务的变化。这样脏读、不可重复的读和虚读都是允许的。
TRANSACTION_READ_COMMITTED: 读取未提交的数据是不允许的。这个级别仍然允许不可重复的读和虚读产生。
TRANSACTION_REPEATABLE_READ: 事务保证能够再次读取相同的数据而不会失败,但虚读仍然会出现。
TRANSACTION_SERIALIZABLE:是最高的事务级别,它防止脏读、不可重复的读和虚读。
在程序开发时可以通过Connection对象使用上面的几种隔离级别,事物的级别越高,性能损耗就越大。