环境: mysql ,window,j2se,spring想实现这样的一个事务1,保存一条记录a 到表A
2,保存一条记录b 到表B他们处在一个事务中,但问题是a的主键id是b里的一个not-null,如果在同一个事务中,执行到2的时候,其实1在数据库中也没有保存,所以也没有id的值,那么这时在执行2的时候就会出现not-null的错误?如何解决这个问题?
2,保存一条记录b 到表B他们处在一个事务中,但问题是a的主键id是b里的一个not-null,如果在同一个事务中,执行到2的时候,其实1在数据库中也没有保存,所以也没有id的值,那么这时在执行2的时候就会出现not-null的错误?如何解决这个问题?
a表的id是自动增长的?
a中的cola是主键,b中的colc是主键,同时b中的cola是外键,那么插入语句应该这么写:
start transaction;
insert into a(cola,colb) values("test","hello"); -- 第一步必须先执行
insert into b(colc,cola) values("mysql","test"); -- 第二步才执行这个
commit;
我执行完insert into a(cola,colb) values(xx,hello");(注,我是通过hibernate来插入数据)
我去数据库中查看好象还没有这条记录.我请教过其他人,他们说如果在一个session中,这条数据已经存在了,而当commit操作的时候,这条数据才对所有session公开.现在的问题是,在一个事务中,执行完insert into a(cola,colb) values(xx,hello");后,我该如何去取得他的主键id.
谢谢大家的帮忙.
我是这样做的。
基于jdbc:
public Long testTransactionInJdbc(){
//最原始的用sql语言写的验证事务的语句
String sql="SET AUTOCOMMIT=0; " +
" start transaction; "+
" insert into user (name) values ('roger'); "+
"select @userid:= @@identity; "+
"insert into userB (name,contactId) values ('my',@userid); "+
" commit ;";
//mysql 事务在jdbc中的实现
String INSERT ="insert into user (name) values ('roger')";
String GET="select @@identity";
String INSERT1="insert into userB (name,contactId) values (?,?)";
try {
con.setAutoCommit(false);
DelegatingStatement pst = (DelegatingStatement)con.createStatement();
//PreparedStatement pst = (PreparedStatement)con.createStatement();
ResultSet set=null;
pst.execute(INSERT);
set=pst.executeQuery(GET);
set.absolute(1);
int num=set.getInt("@@identity");
System.out.println("num="+num);
PreparedStatement pst1=con.prepareStatement(INSERT1);
pst1.setString(1,"lily");
pst1.setShort(2, (short)num);
//pst.execute(INSERT1);
pst1.execute();
con.commit();
} catch (SQLException e) {
e.printStackTrace();
try {
con.rollback();
} catch (SQLException f) {
f.printStackTrace();
}
}
return null;
}基于hibernate+spring
UserService:
public void saveAll(User user,UserB userB){
userDao.saveUser(user);
System.out.println(user.getId());
userB.setContactId(user.getId());
userBDao.saveUserB(userB);
}
同时在xml配置saveall事务