我们无法提前知道批量更新的记录是否全部能成功,也无法知道哪一条记录会产生错误。在默认情况下,每条记录的更新结果都会自动提交,就使结果变得不可预知了,这对于数据库管理可不是一个好现象。
在处理数据库事务时,有时候需要根据情况,来决定是将改动提交到数据库,还是取消操作,这个时候,就需要使用db.commit()和db.rollback()来进行控制。
在默认情况下,在集算器中执行语句都是自动提交的,此时是无法自行控制的。如果想用db.commit()和db.rollback()来进行控制,需要在执行execute或update语句时使用@k选项,用代码控制提交。这样,就可以根据错误信息,来决定数据是否有效了。如下面的例子,在批量执行更新时,如果产生错误,则所有数据全部无效,这样就可以避免数据库中出现不可预知的结果:
|
A |
B |
1 |
=demo.query("select * from CITIES") |
|
2 |
=connect@e("DbCon") |
|
3 |
>A2.execute("delete from CityBak") |
|
4 |
>A2.update@k(A1,CityBak,ID:CID,CITY:NAME,POPULATION,STATE:STATEID) |
|
5 |
if A2.error()==0 |
>A2.commit() |
6 |
else |
>A2.rollback() |
7 |
=A2.query("select * from CityBak") |
|
8 |
>A2.update@k(A1.to(5),CityBak,ID:CID, CITY:NAME,POPULATION,STATE:STATEID) |
|
9 |
if A2.error()==0 |
>A2.commit() |
10 |
else |
>A2.rollback() |
11 |
=A2.query("select * from CityBak") |
|
12 |
>A2.close() |
|
A3中,将CityBak中的数据清空,由于在执行db.execute()时未使用@k选项,因此会自动进行提交。
A4中,执行批量更新时,会产生错误,这可以从A5的运算结果中看到:
因此会执行B6中的回滚操作而不是B5中的提交,数据不会写入数据库。A7中的查询结果如下:
使用@k选项进行批量更新时,如果未产生错误,如A8中执行的语句,也可以根据错误代码判断,A9中值为:
此时会执行B9中的提交操作,数据写入数据库。A11中的查询结果如下: