I'm guessing that these are assignments, rather than commercial applications??
In which case I would recommend sticking with something simple (sqllite or mysql).
I would say that for an ATM application, transactional integrity is crucial, and I would argue that it is better to use a system you trust to implement that correctly, rather than try and roll your own.
As to which database - the client language is pretty much irrelevant - you can access any of them from most languages. In C++ you can use ODBC in a similar way to JDBC for Java (to abstract your program away from underlying technology).
mySQL does implement transactions (not by default - or has it changed??). Some language frameworks 'break' transactions by automatically committing after any d/b update.
Where the 'bigger' databases excel is in support of many concurrent processes, often trying to update the same data - one of Oracle's big selling points for many years is that 'readers' were never blocked by 'writers', and that 'readers' would always get a consistent view of the data (i.e. a reader would never get a partial update). SQL Server and postgres both support the same.
If you're just doing a single-user / single-threaded demonstration system, then you probably don't have a requirement to use anything larger.