It's often desirable to execute a group of SQL updates or queries atomically; for example, if you transfer funds from bank account A to bank account B, you don't want to deposit the money in account B if the withdrawal from account A failed. Database transactions let you treat any number of SQL updates atomically-if one of the updates fails, the entire transaction is rolled back. The transaction is committed only if all of the updates are successful. JSTL supports database transactions with the action. This sample shows how this action can be used for safe access to a database:

<%@ taglib uri='http://java.sun.com/jstl/core' prefix='c'%>
<%@ taglib uri='http://java.sun.com/jstl/sql' prefix='sql'%>
<%@ taglib uri='http://java.sun.com/jstl/fmt' prefix='fmt'%>

<html>
	...

	<body>

/// the transaction is enclosed in a <c:catch> action. if the 
/// transaction fails, the <sql:transaction> action will throw 
/// an exception, which <c:catch> stores in a scoped variable 
/// named transactionException:

	<c:catch var='transactionException'>
		
		<%-- The transaction... --%>
		<sql:transaction>
		
			<%-- Withdraw money from the "from" 
			     customer's account --%>
			     
			<sql:update>
				...
			</sql:update>
	
			...
		</sql:transaction>
	</c:catch>

/// if the transactionException scoped variable is not empty, 
/// the transaction failed:
	<c:if test='${not empty transactionException}'>
		<%-- Display the error message --%>
		<font size='4' color='red'>
			Transaction Failed!
		</font>
	</c:if>
	...

	</body>
	
</html>